public void updateServiceMetadata(String serviceUrl, Metadata meta) throws Exception {

    GridService service = getGridServiceDao().getByUrl(serviceUrl);
    if (service == null) {
      throw new RuntimeException("Coudln't find service for " + serviceUrl);
    }

    Set<CQLQueryInstance> cqlQueryInstances = new HashSet<CQLQueryInstance>();
    Map<String, SharedCQLQuery> sharedCqlQueries = new HashMap<String, SharedCQLQuery>();
    if (meta.dmodel != null) {

      // Need to preserve associations with SharedQuery objects
      // and CQLQueryInstance objects.

      GridDataService dataService = (GridDataService) service;
      for (SharedCQLQuery query : getSharedCqlQueryDao().getByDataService(dataService)) {
        UMLClass umlClass = query.getTargetClass();
        sharedCqlQueries.put(umlClass.getPackageName() + "." + umlClass.getClassName(), query);
      }
      cqlQueryInstances.addAll(getCqlQueryInstanceDao().getByDataService(dataService));
    }

    // NOTE: Associations with XML schemas in GME is handled
    // by the XMLSchemaMonitor. So, we don't need to address it here.

    getGridServiceDao().deleteMetadata(service);
    setMetadata(service, meta);
    getGridServiceDao().save(service);
    getGridServiceDao().getHibernateTemplate().flush();

    if (sharedCqlQueries.size() > 0) {
      GridDataService dataService = (GridDataService) service;
      for (UMLClass umlClass : dataService.getDomainModel().getClasses()) {
        SharedCQLQuery query =
            sharedCqlQueries.get(umlClass.getPackageName() + "." + umlClass.getClassName());
        if (query != null) {
          query.setTargetClass(umlClass);
          query.setTargetService(dataService);
          getSharedCqlQueryDao().save(query);
        }
      }
    }

    if (cqlQueryInstances.size() > 0) {
      GridDataService dataService = (GridDataService) service;
      for (CQLQueryInstance instance : cqlQueryInstances) {
        instance.setDataService(dataService);
        getCqlQueryInstanceDao().save(instance);
      }
    }
  }