From b4a18a6bce1d1e1b34368b1649399bf83e4b294a Mon Sep 17 00:00:00 2001
From: edgrif <edgrif>
Date: Thu, 14 Jan 2010 13:34:37 +0000
Subject: [PATCH] add look up of feature style from source data info., add
 better error handling for feature create.

---
 src/zmapView/zmapViewRemoteReceive.c | 186 +++++++++++++++++----------
 1 file changed, 121 insertions(+), 65 deletions(-)

diff --git a/src/zmapView/zmapViewRemoteReceive.c b/src/zmapView/zmapViewRemoteReceive.c
index 0f7e6ed7c..f6e681fb7 100755
--- a/src/zmapView/zmapViewRemoteReceive.c
+++ b/src/zmapView/zmapViewRemoteReceive.c
@@ -29,9 +29,9 @@
  * Exported functions: See zmapView_P.h
  *              
  * HISTORY:
- * Last edited: Oct 19 16:00 2009 (edgrif)
+ * Last edited: Jan 14 13:22 2010 (edgrif)
  * Created: Tue Jul 10 21:02:42 2007 (rds)
- * CVS info:   $Id: zmapViewRemoteReceive.c,v 1.36 2009-12-15 13:49:10 mh17 Exp $
+ * CVS info:   $Id: zmapViewRemoteReceive.c,v 1.37 2010-01-14 13:34:37 edgrif Exp $
  *-------------------------------------------------------------------
  */
 
@@ -118,6 +118,8 @@ typedef struct
   ZMapFeature          feature;
 
   GQuark source_id ;
+  GQuark style_id ;
+  ZMapFeatureTypeStyle style ;
 
   GList             *feature_list;
   GData             *styles;
@@ -156,7 +158,7 @@ typedef struct
 static char *view_execute_command(char *command_text, gpointer user_data, int *statusCode);
 static char *view_post_execute(char *command_text, gpointer user_data, int *statusCode);
 static void delete_failed_make_message(gpointer list_data, gpointer user_data);
-static void drawNewFeatures(ZMapView view, RequestData input_data, ResponseData output_data);
+static gboolean drawNewFeatures(ZMapView view, RequestData input_data, ResponseData output_data);
 static void getChildWindowXID(ZMapView view, RequestData input_data, ResponseData output_data);
 static void viewDumpContextToFile(ZMapView view, RequestData input_data, ResponseData output_data);
 static gboolean sanityCheckContext(ZMapView view, RequestData input_data, ResponseData output_data);
@@ -350,11 +352,20 @@ static char *view_execute_command(char *command_text, gpointer user_data, int *s
 	  {
 	    if (sanityCheckContext(view, &input_data, &output_data))
 	      {
-		drawNewFeatures(view, &input_data, &output_data);
+		ZMapFeatureAny feature ;
 
-		/* slice the input_data into the post_data to make the view_post_execute happy. */
-		if(view->xremote_widget && input_data.edit_context)
+		if (!(feature = zMapFeatureContextFindFeatureFromFeature(view->features,
+									 input_data.feature)))
 		  {
+		    g_string_append_printf(output_data.messages,
+					   "Feature \"%s\" already exists in view",
+					   g_quark_to_string(input_data.feature->original_id)) ;
+		    output_data.code = ZMAPXREMOTE_FAILED ;
+		  }
+		else if (drawNewFeatures(view, &input_data, &output_data)
+			 && (view->xremote_widget && input_data.edit_context))
+		  {
+		    /* slice the input_data into the post_data to make the view_post_execute happy. */
 		    PostExecuteData post_data = g_new0(PostExecuteDataStruct, 1);
 
 		    post_data->action       = input.common.action;
@@ -631,39 +642,41 @@ static void eraseFeatures(ZMapView view, RequestData input_data, ResponseData ou
   return ;
 }
 
-static void drawNewFeatures(ZMapView view, RequestData input_data, ResponseData output_data)
+static gboolean drawNewFeatures(ZMapView view, RequestData input_data, ResponseData output_data)
 {
+  gboolean result = FALSE ;
 
-#ifdef ED_G_NEVER_INCLUDE_THIS_CODE
-  /* we shouldn't need to do this..styles should be there and ok..... */
-
-  zMapFeatureAnyForceModesToStyles((ZMapFeatureAny)(input_data->edit_context), NULL) ;
-#endif /* ED_G_NEVER_INCLUDE_THIS_CODE */
+  if (!(input_data->edit_context = zmapViewMergeInContext(view, input_data->edit_context)))
+    {
+      g_string_append(output_data->messages, "Merge of new feature into View feature context failed") ;
+      output_data->code = ZMAPXREMOTE_FAILED ;
+    }
+  else
+    {
+      zMapFeatureContextExecute((ZMapFeatureAny)(input_data->edit_context), 
+				ZMAPFEATURE_STRUCT_FEATURE,
+				delete_from_list,
+				&(input_data->feature_list));
 
-  
-  input_data->edit_context = zmapViewMergeInContext(view, input_data->edit_context) ;
-  
-  zMapFeatureContextExecute((ZMapFeatureAny)(input_data->edit_context), 
-                            ZMAPFEATURE_STRUCT_FEATURE,
-                            delete_from_list,
-                            &(input_data->feature_list));
+      zMapFeatureContextExecute((ZMapFeatureAny)(view->features), 
+				ZMAPFEATURE_STRUCT_FEATURE,
+				mark_matching_invalid,
+				&(input_data->feature_list));
 
-  zMapFeatureContextExecute((ZMapFeatureAny)(view->features), 
-                            ZMAPFEATURE_STRUCT_FEATURE,
-                            mark_matching_invalid,
-                            &(input_data->feature_list));
+      output_data->code = 0;
 
-  output_data->code = 0;
+      if (g_list_length(input_data->feature_list))
+	g_list_foreach(input_data->feature_list, draw_failed_make_message, output_data);
 
-  if(g_list_length(input_data->feature_list))
-    g_list_foreach(input_data->feature_list, draw_failed_make_message, output_data);
+      if (output_data->code == 0)
+	output_data->code = ZMAPXREMOTE_OK ;
 
-  if(output_data->code == 0)
-    output_data->code = ZMAPXREMOTE_OK;
+      output_data ->handled = TRUE ;
 
-  output_data->handled = TRUE;
+      result = TRUE ;
+    }
 
-  return ;
+  return result ;
 }
 
 
@@ -813,8 +826,8 @@ static void populate_data_from_view(ZMapView view, RequestData xml_data)
 /* 
  *
  * <zmap action="create_feature">
- *   <featureset>
- *     <feature name="RP6-206I17.6-001" start="3114" end="99885" strand="-" style="Coding">
+ *   <featureset name="Coding">
+ *     <feature name="RP6-206I17.6-001" start="3114" end="99885" strand="-">
  *       <subfeature ontology="exon"   start="3114"  end="3505" />
  *       <subfeature ontology="intron" start="3505"  end="9437" />
  *       <subfeature ontology="exon"   start="9437"  end="9545" />
@@ -834,8 +847,8 @@ static void populate_data_from_view(ZMapView view, RequestData xml_data)
  * </zmap>
  *
  *  <zmap action="delete_feature">
- *    <featureset>
- *      <feature name="U.2969591-3331416" start="87607" end="87608" strand="+" style="polyA_site" score="0.000"></feature>
+ *    <featureset name="polyA_site">
+ *      <feature name="U.2969591-3331416" start="87607" end="87608" strand="+"score="0.000"></feature>
  *    </featureset>
  *  </zmap>
  *
@@ -1184,6 +1197,44 @@ static gboolean xml_featureset_start_cb(gpointer user_data, ZMapXMLElement set_e
 	  result = TRUE ;
 	}
 
+      /* We must be able to look up the column and other data for this featureset otherwise we
+       * won't know which column/style etc to use. */
+      if (result)
+	{
+	  ZMapGFFSource source_data ;
+
+	  if (!(source_data = g_hash_table_lookup(request_data->view->source_2_sourcedata,
+						  GINT_TO_POINTER(set_id))))
+	    {
+	      char *err_msg ;
+
+	      err_msg = g_strdup_printf("Source %s not found in view->source_2_sourcedata",
+					g_quark_to_string(set_id)) ;
+	      zMapXMLParserRaiseParsingError(parser, err_msg) ;
+	      g_free(err_msg) ;
+		  
+	      result = FALSE ;
+	    }
+	  else
+	    {
+	      request_data->style_id = source_data->style_id ;
+
+	      if (!(request_data->style = zMapFindStyle(request_data->view->orig_styles, request_data->style_id)))
+		{
+		  char *err_msg ;
+
+		  err_msg = g_strdup_printf("Style %s not found in view->orig_styles",
+					  g_quark_to_string(request_data->style_id)) ;
+		  zMapXMLParserRaiseParsingError(parser, err_msg) ;
+		  g_free(err_msg) ;
+
+		  result = FALSE ;
+		}
+	    }
+	}
+
+
+
 
       if (result)
 	{
@@ -1201,6 +1252,8 @@ static gboolean xml_featureset_start_cb(gpointer user_data, ZMapXMLElement set_e
 
 	    case ZMAPVIEW_REMOTE_GET_FEATURE_NAMES:
 	      {
+		/* NOTE SURE WHY THIS IS HERE.....should be in the feature handler ?? */
+
 		if (result && (attr = zMapXMLElementGetAttributeByName(set_element, "start")))
 		  {
 		    request_data->start = strtol((char *)g_quark_to_string(zMapXMLAttributeGetValue(attr)), 
@@ -1291,9 +1344,17 @@ static gboolean xml_feature_start_cb(gpointer user_data, ZMapXMLElement feature_
   RequestData request_data = (RequestData)(xml_data->user_data);
   ZMapFeatureAny feature_any;
   ZMapStrand strand = ZMAPSTRAND_NONE;
-  GQuark feature_name_q = 0, style_q = 0, style_id;
   gboolean has_score = FALSE, start_not_found = FALSE, end_not_found = FALSE;
-  char *feature_name, *style_name;
+
+  char *feature_name ;
+  GQuark feature_name_q = 0 ;
+
+#ifdef ED_G_NEVER_INCLUDE_THIS_CODE
+  char *style_name ;
+  GQuark style_q = 0, style_id ;
+#endif /* ED_G_NEVER_INCLUDE_THIS_CODE */
+
+
   int start = 0, end = 0, start_phase = ZMAPPHASE_NONE;
   double score = 0.0;
 
@@ -1324,16 +1385,6 @@ static gboolean xml_feature_start_cb(gpointer user_data, ZMapXMLElement feature_
 	  }
         
 
-        if (result && (attr = zMapXMLElementGetAttributeByName(feature_element, "style")))
-          {
-            style_q = zMapXMLAttributeGetValue(attr);
-          }
-        else
-	  {
-	    zMapXMLParserRaiseParsingError(parser, "style is a required attribute for feature.");
-   	    result = FALSE ;
-	  }
-     
         if (result && (attr = zMapXMLElementGetAttributeByName(feature_element, "start")))
           {
             start = strtol((char *)g_quark_to_string(zMapXMLAttributeGetValue(attr)), 
@@ -1411,39 +1462,34 @@ static gboolean xml_feature_start_cb(gpointer user_data, ZMapXMLElement feature_
         
         if (result && !zMapXMLParserLastErrorMsg(parser))
           {
+
+#ifdef ED_G_NEVER_INCLUDE_THIS_CODE
 	    ZMapFeatureTypeStyle style ;
             style_name = (char *)g_quark_to_string(style_q);
             style_id = zMapStyleCreateID(style_name);
-            feature_name = (char *)g_quark_to_string(feature_name_q);
+#endif /* ED_G_NEVER_INCLUDE_THIS_CODE */
 
-	    if (!(style = zMapFindStyle(request_data->view->orig_styles, style_id)))
-	      {
-		char *err_msg ;
 
-		err_msg = g_strdup_printf("Style %s not found in view->orig_styles",
-					  g_quark_to_string(style_id)) ;
-		zMapXMLParserRaiseParsingError(parser, err_msg) ;
-		g_free(err_msg) ;
 
-		result = FALSE ;
-	      }
+
+
+
+            feature_name = (char *)g_quark_to_string(feature_name_q);
 
             if (result
-		&& (request_data->feature
-		    = zMapFeatureCreateFromStandardData(feature_name, NULL, "", 
-							ZMAPSTYLE_MODE_BASIC, style,
-							start, end, has_score,
-							score, strand, ZMAPPHASE_NONE)))
+		&& (request_data->feature = zMapFeatureCreateFromStandardData(feature_name, NULL, "", 
+									      ZMAPSTYLE_MODE_BASIC,
+									      request_data->style,
+									      start, end, has_score,
+									      score, strand, ZMAPPHASE_NONE)))
               {
-		request_data->feature->style_id = style_id;
+		request_data->feature->style_id = request_data->style_id ;
 
 		zMapFeatureSetAddFeature(request_data->feature_set, request_data->feature);
 
-
 		/* We need to get all the source info. in here somehow.... */
 		zMapFeatureAddText(request_data->feature, request_data->source_id, NULL, NULL) ;
 
-
 		if (start_not_found || end_not_found)
 		  {
 		    request_data->feature->type = ZMAPSTYLE_MODE_TRANSCRIPT;
@@ -1782,13 +1828,23 @@ static void reportWindowMark(ZMapView view, RequestData input_data, ResponseData
     {
       g_string_append_printf(output_data->messages,
 			     "<mark exists=\"true\" start=\"%d\" end=\"%d\" />", start, end) ;
+
+      output_data->code = ZMAPXREMOTE_OK ;
     }
   else
     {
       g_string_append(output_data->messages, "<mark exists=\"false\" />") ;
+
+
+#ifdef ED_G_NEVER_INCLUDE_THIS_CODE
+      /* i'd like to return an error code but this would need sorting out... */
+
+      output_data->code = ZMAPXREMOTE_FAILED;
+#endif /* ED_G_NEVER_INCLUDE_THIS_CODE */
+      output_data->code = ZMAPXREMOTE_OK ;
     }
 
-  output_data->code = ZMAPXREMOTE_OK ;
+
 
   return ;
 }
-- 
GitLab