teichmann@5861: /* Copyright (C) 2011, 2012, 2013 by Bundesanstalt für Gewässerkunde teichmann@5861: * Software engineering by Intevation GmbH teichmann@5861: * teichmann@5993: * This file is Free Software under the GNU AGPL (>=v3) teichmann@5861: * and comes with ABSOLUTELY NO WARRANTY! Check out the teichmann@5993: * documentation coming with Dive4Elements River for details. teichmann@5861: */ teichmann@5861: teichmann@5835: package org.dive4elements.river.client.server; bjoern@3515: teichmann@5835: import org.dive4elements.artifacts.common.ArtifactNamespaceContext; teichmann@5835: import org.dive4elements.artifacts.common.utils.XMLUtils; teichmann@5835: import org.dive4elements.artifacts.httpclient.exceptions.ConnectionException; teichmann@5835: import org.dive4elements.artifacts.httpclient.http.HttpClient; teichmann@5835: import org.dive4elements.artifacts.httpclient.http.HttpClientImpl; teichmann@5835: import org.dive4elements.river.client.client.services.ModuleService; teichmann@5835: import org.dive4elements.river.client.server.auth.User; teichmann@5835: import org.dive4elements.river.client.shared.exceptions.ServerException; teichmann@5835: import org.dive4elements.river.client.shared.model.DefaultModule; teichmann@5835: import org.dive4elements.river.client.shared.model.Module; christian@3540: bjoern@3515: import java.util.ArrayList; bjoern@3515: import java.util.List; bjoern@3515: bjoern@3529: import javax.xml.xpath.XPathConstants; bjoern@3529: bjoern@3515: import org.apache.log4j.Logger; bjoern@3529: import org.w3c.dom.Document; bjoern@3529: import org.w3c.dom.Element; bjoern@3529: import org.w3c.dom.NodeList; bjoern@3529: bjoern@3515: public class ModuleServiceImpl bjoern@3515: extends RemoteServiceServlet bjoern@3515: implements ModuleService bjoern@3515: { teichmann@8203: private static final Logger log = bjoern@3515: Logger.getLogger(ModuleServiceImpl.class); bjoern@3515: bjoern@3529: public static final String XPATH_MODULES = "/art:modules/art:module"; bjoern@3515: bjoern@3529: public static final String ERROR_NO_MODULES_FOUND = bjoern@3529: "error_no_module_found"; bjoern@3515: bjoern@3515: @Override gernotbelger@8870: public Module[] list(final String locale) throws ServerException { gernotbelger@8870: final User user = this.getUser(); bjoern@3515: teichmann@8203: log.info("ModuleService.list"); bjoern@3515: gernotbelger@8870: final String url = getServletContext().getInitParameter("server-url"); bjoern@3529: bjoern@3529: // create dummy xml gernotbelger@8870: final Document doc = XMLUtils.newDocument(); bjoern@3529: gernotbelger@8870: final XMLUtils.ElementCreator ec = new XMLUtils.ElementCreator( bjoern@3529: doc, bjoern@3529: ArtifactNamespaceContext.NAMESPACE_URI, bjoern@3529: ArtifactNamespaceContext.NAMESPACE_PREFIX); bjoern@3529: gernotbelger@8870: final Element dummy = ec.create("modules"); bjoern@3529: doc.appendChild(dummy); bjoern@3529: gernotbelger@8870: final HttpClient client = new HttpClientImpl(url, locale); bjoern@3529: try { gernotbelger@8870: final Document result = client.callService(url, "modules", doc); bjoern@3529: gernotbelger@8870: final NodeList list = (NodeList) XMLUtils.xpath( bjoern@3529: result, bjoern@3529: XPATH_MODULES, bjoern@3529: XPathConstants.NODESET, bjoern@3529: ArtifactNamespaceContext.INSTANCE); bjoern@3529: bjoern@3529: if (list == null) { teichmann@8203: log.warn("No modules found."); bjoern@3529: bjoern@3529: throw new ServerException(ERROR_NO_MODULES_FOUND); bjoern@3515: } bjoern@3529: gernotbelger@8870: final int num = list.getLength(); bjoern@3529: gernotbelger@8870: final List modules = new ArrayList(list.getLength()); bjoern@3529: for(int i =0; i < num; i++) { gernotbelger@8870: final Element em = (Element)list.item(i); gernotbelger@8870: final String name = em.getAttributeNS(ArtifactNamespaceContext.NAMESPACE_URI, "name"); gernotbelger@8870: final String localname = em.getAttributeNS(ArtifactNamespaceContext.NAMESPACE_URI, "localname"); gernotbelger@8870: final String strselected = em.getAttributeNS(ArtifactNamespaceContext.NAMESPACE_URI, "selected"); gernotbelger@8870: boolean selected = Boolean.parseBoolean(strselected); gernotbelger@8870: final String group = em.getAttributeNS(ArtifactNamespaceContext.NAMESPACE_URI, "groupId"); gernotbelger@8870: final String groupLabel = em.getAttributeNS(ArtifactNamespaceContext.NAMESPACE_URI, "groupLabel"); gernotbelger@8870: gernotbelger@8870: final NodeList rivers = em.getChildNodes(); gernotbelger@8870: final List riverUuids = new ArrayList(rivers.getLength()); rrenkert@7761: for (int j = 0; j < rivers.getLength(); j++) { gernotbelger@8870: final Element re = (Element)rivers.item(j); rrenkert@7761: riverUuids.add(re.getAttribute("uuid")); rrenkert@7761: } teichmann@8203: log.debug("Found module " + name + " " + localname); bjoern@3529: if (user == null || user.canUseFeature("module:" + name)) { gernotbelger@8870: modules.add(new DefaultModule(name, localname, selected, group, groupLabel, riverUuids)); bjoern@3529: } bjoern@3529: } bjoern@3529: return modules.toArray(new Module[modules.size()]); bjoern@3515: } bjoern@3529: catch (ConnectionException ce) { teichmann@8203: log.error(ce, ce); bjoern@3529: } bjoern@3529: bjoern@3529: throw new ServerException(ERROR_NO_MODULES_FOUND); bjoern@3515: } bjoern@3515: } bjoern@3515: bjoern@3515: // vim:set ts=4 sw=4 si et sta sts=4 fenc=utf8 tw=80 :