]> git.aero2k.de Git - tmp/jakarta-migration.git/commitdiff
CSPACE-5488: More refactoring authority item partial term searches to work in resourc...
authorRichard Millet <richard.millet@berkeley.edu>
Wed, 5 Sep 2012 07:19:08 +0000 (00:19 -0700)
committerRichard Millet <richard.millet@berkeley.edu>
Wed, 5 Sep 2012 07:19:08 +0000 (00:19 -0700)
services/authority/service/src/main/java/org/collectionspace/services/common/vocabulary/AuthorityResource.java
services/client/src/main/java/org/collectionspace/services/client/CollectionSpaceProxy.java
services/client/src/main/java/org/collectionspace/services/client/IClientQueryParams.java
services/common/src/main/java/org/collectionspace/services/common/ResourceBase.java
services/common/src/main/java/org/collectionspace/services/common/document/DocumentFilter.java
services/common/src/main/java/org/collectionspace/services/common/query/nuxeo/QueryManagerNuxeoImpl.java
services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/DocHandlerBase.java
services/common/src/main/java/org/collectionspace/services/nuxeo/client/java/RemoteDocumentModelHandlerImpl.java
services/movement/client/src/main/java/org/collectionspace/services/client/MovementProxy.java
services/relation/client/src/main/java/org/collectionspace/services/client/RelationProxy.java
services/vocabulary/service/src/main/java/org/collectionspace/services/vocabulary/VocabularyResource.java

index 1493735adc3d1998d724582505e135046435770c..9342cce0d305e9da9b373dcc9d2ce6f8ee2ae028 100644 (file)
@@ -429,7 +429,7 @@ public abstract class AuthorityResource<AuthCommon, AuthItemHandler>
             DocumentFilter myFilter = handler.getDocumentFilter();
             // Need to make the default sort order for authority items
             // be on the displayName field
-            String sortBy = queryParams.getFirst(IClientQueryParams.SORT_BY_PARAM);
+            String sortBy = queryParams.getFirst(IClientQueryParams.ORDER_BY_PARAM);
             if (sortBy == null || sortBy.isEmpty()) {
                 String qualifiedDisplayNameField = authorityCommonSchemaName + ":"
                         + AuthorityItemJAXBSchema.DISPLAY_NAME;
@@ -690,36 +690,27 @@ public abstract class AuthorityResource<AuthCommon, AuthItemHandler>
     @Produces("application/xml")
     public AbstractCommonList getAuthorityItemList(@PathParam("csid") String specifier,
             @Context UriInfo ui) {
+       AbstractCommonList result = null;
+       
         try {
             MultivaluedMap<String, String> queryParams = ui.getQueryParameters();
-            String partialTerm = queryParams.getFirst(IQueryManager.SEARCH_TYPE_PARTIALTERM);
+            String orderBy = queryParams.getFirst(IClientQueryParams.ORDER_BY_PARAM);
             String termStatus = queryParams.getFirst(SEARCH_TYPE_TERMSTATUS);
             String keywords = queryParams.getFirst(IQueryManager.SEARCH_TYPE_KEYWORDS_KW);
             String advancedSearch = queryParams.getFirst(IQueryManager.SEARCH_TYPE_KEYWORDS_AS);
+            String partialTerm = queryParams.getFirst(IQueryManager.SEARCH_TYPE_PARTIALTERM);
 
-            // Note that docType defaults to the ServiceName, so we're fine with that.
-            ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx = null;
-
-            String parentcsid = PARENT_WILDCARD.equals(specifier)?null:
-                                               lookupParentCSID(specifier, "getAuthorityItemList", "LIST", queryParams);
-
-            ctx = createServiceContext(getItemServiceName(), queryParams);
-
+            ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx = createServiceContext(getItemServiceName(), queryParams);
             // For the wildcard case, parentcsid is null, but docHandler will deal with this.
             // We omit the parentShortId, only needed when doing a create...
-            DocumentHandler<?, AbstractCommonList, DocumentModel, DocumentModelList> handler = createItemDocumentHandler(ctx, parentcsid, null);
+            String parentcsid = PARENT_WILDCARD.equals(specifier) ? null :
+                               lookupParentCSID(specifier, "getAuthorityItemList", "LIST", queryParams);
+            DocumentHandler<?, AbstractCommonList, DocumentModel, DocumentModelList> handler =
+               createItemDocumentHandler(ctx, parentcsid, null);
             
             DocumentFilter myFilter = handler.getDocumentFilter();
-            // Need to make the default sort order for authority items
-            // be on the displayName field
-            String sortBy = queryParams.getFirst(IClientQueryParams.SORT_BY_PARAM);
-            if (sortBy == null || sortBy.isEmpty()) {
-                String orderByField = getOrderByField();
-                myFilter.setOrderByClause(orderByField);
-            }
-
             // If we are not wildcarding the parent, add a restriction
-            if(parentcsid!=null) {
+            if (parentcsid != null) {
                    myFilter.appendWhereClause(authorityItemCommonSchemaName + ":"
                            + AuthorityItemJAXBSchema.IN_AUTHORITY + "="
                            + "'" + parentcsid + "'",
@@ -734,30 +725,13 @@ public abstract class AuthorityResource<AuthCommon, AuthItemHandler>
                String tsClause = QueryManager.createWhereClauseToFilterFromStringList(qualifiedTermStatusField, filterTerms, IQueryManager.FILTER_EXCLUDE);
                 myFilter.appendWhereClause(tsClause, IQueryManager.SEARCH_QUALIFIER_AND);
             }
-                
-            // AND vocabularyitems_common:displayName LIKE '%partialTerm%'
-            // NOTE: Partial terms searches are mutually exclusive to keyword and advanced-search, but
-            // the PT query param trumps the KW and AS query params.
-            if (partialTerm != null && !partialTerm.isEmpty()) {
-               String partialTermMatchField = getPartialTermMatchField();
-                String ptClause = QueryManager.createWhereClauseForPartialMatch(
-                               partialTermMatchField, partialTerm);
-                myFilter.appendWhereClause(ptClause, IQueryManager.SEARCH_QUALIFIER_AND);
-            } else if (keywords != null || advancedSearch != null) {
-//                             String kwdClause = QueryManager.createWhereClauseFromKeywords(keywords);
-//                             myFilter.appendWhereClause(kwdClause, IQueryManager.SEARCH_QUALIFIER_AND);
-                return search(ctx, handler, queryParams, keywords, advancedSearch);
-            }
-            if (logger.isDebugEnabled()) {
-                logger.debug("getAuthorityItemList filtered WHERE clause: "
-                        + myFilter.getWhereClause() 
-                        + " and ORDER BY clause: " + myFilter.getOrderByClause());
-            }
-            getRepositoryClient(ctx).getFiltered(ctx, handler);
-            return handler.getCommonPartList();
+
+            result = search(ctx, handler, queryParams, orderBy, keywords, advancedSearch, partialTerm);            
         } catch (Exception e) {
             throw bigReThrow(e, ServiceMessages.LIST_FAILED);
         }
+        
+        return result;
     }
 
     /**
index 18acc9eced1323d7e97efb663f4782a07a14593c..c9dbdda6eaa3880df5834589b65101b2fc933666 100644 (file)
@@ -102,7 +102,7 @@ public interface CollectionSpaceProxy<CLT> {
     @GET\r
     @Produces({"application/xml"})\r
     ClientResponse<CLT> readList(\r
-            @QueryParam(IClientQueryParams.SORT_BY_PARAM) String sortBy,\r
+            @QueryParam(IClientQueryParams.ORDER_BY_PARAM) String sortBy,\r
             @QueryParam(IClientQueryParams.PAGE_SIZE_PARAM) Long pageSize,\r
            @QueryParam(IClientQueryParams.START_PAGE_PARAM) Long pageNumber);    \r
 }\r
index 40a67a8b86e159ba569ad7c0a3160c8ddb44d0be..2401c6119e79ff5ea8d2a169743b407180339923 100644 (file)
@@ -30,7 +30,7 @@ public interface IClientQueryParams {
 \r
     public static final String PAGE_SIZE_PARAM = "pgSz";\r
     public static final String START_PAGE_PARAM = "pgNum";\r
-    public static final String SORT_BY_PARAM = "sortBy";\r
+    public static final String ORDER_BY_PARAM = "sortBy";\r
     public static final String IMPORT_TIMEOUT_PARAM = "impTimout";\r
     \r
 }\r
index 32a43a5a34bd1b922bce92a3f1f886e26205a9bc..dc113ace2c9ca5a47394f716dd8e94503dddfdc2 100644 (file)
@@ -23,6 +23,7 @@
  */\r
 package org.collectionspace.services.common;\r
 \r
+import org.collectionspace.services.client.IClientQueryParams;\r
 import org.collectionspace.services.client.IQueryManager;\r
 import org.collectionspace.services.client.PoxPayloadIn;\r
 import org.collectionspace.services.client.PoxPayloadOut;\r
@@ -267,13 +268,14 @@ public abstract class ResourceBase
     @GET\r
     public AbstractCommonList getList(@Context UriInfo ui) {\r
         MultivaluedMap<String, String> queryParams = ui.getQueryParameters();\r
+        String orderBy = queryParams.getFirst(IClientQueryParams.ORDER_BY_PARAM);\r
         String keywords = queryParams.getFirst(IQueryManager.SEARCH_TYPE_KEYWORDS_KW);\r
         String advancedSearch = queryParams.getFirst(IQueryManager.SEARCH_TYPE_KEYWORDS_AS);\r
         String partialTerm = queryParams.getFirst(IQueryManager.SEARCH_TYPE_PARTIALTERM);\r
 \r
         AbstractCommonList list;\r
         if (keywords != null || advancedSearch != null) {\r
-            list = search(queryParams, keywords, advancedSearch);\r
+            list = search(queryParams, orderBy, keywords, advancedSearch, partialTerm);\r
         } else {\r
             list = getList(queryParams);\r
         }\r
@@ -301,16 +303,26 @@ public abstract class ResourceBase
         }\r
     }\r
 \r
-    protected AbstractCommonList search(ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx,\r
+    protected AbstractCommonList search(\r
+               ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx,\r
                DocumentHandler handler, \r
                MultivaluedMap<String, String> queryParams,\r
+               String orderBy,\r
                String keywords,\r
                String advancedSearch,\r
                String partialTerm) throws Exception {\r
+        DocumentFilter docFilter = handler.getDocumentFilter();      \r
+        if (orderBy == null || orderBy.isEmpty()) {\r
+            String orderByField = getOrderByField(ctx);\r
+            docFilter.setOrderByClause(orderByField);\r
+        }\r
         \r
-        DocumentFilter docFilter = handler.getDocumentFilter();\r
+        //\r
+        //NOTE: Partial-term (PT) searches are mutually exclusive to keyword and advanced-search, but\r
+        // the PT query param trumps the keyword search.\r
+        //\r
         if (partialTerm != null && !partialTerm.isEmpty()) {\r
-               String partialTermMatchField = getPartialTermMatchField();\r
+               String partialTermMatchField = getPartialTermMatchField(ctx);\r
             String ptClause = QueryManager.createWhereClauseForPartialMatch(\r
                        partialTermMatchField, partialTerm);\r
             docFilter.appendWhereClause(ptClause, IQueryManager.SEARCH_QUALIFIER_AND);\r
@@ -327,9 +339,9 @@ public abstract class ResourceBase
                 }\r
             }\r
         }\r
-        \r
+                \r
         //\r
-        // Add an advance search clause if one was specified\r
+        // Add an advance search clause if one was specified -even if PT search was requested?\r
         //\r
         if (advancedSearch != null && !advancedSearch.isEmpty()) {\r
             String whereClause = QueryManager.createWhereClauseFromAdvancedSearch(advancedSearch);\r
@@ -338,25 +350,29 @@ public abstract class ResourceBase
                 logger.debug("The WHERE clause is: " + docFilter.getWhereClause());\r
             }\r
         }\r
-        getRepositoryClient(ctx).getFiltered(ctx, handler);\r
         \r
+        getRepositoryClient(ctx).getFiltered(ctx, handler);        \r
         return (AbstractCommonList) handler.getCommonPartList();\r
     }\r
 \r
-    protected AbstractCommonList search(MultivaluedMap<String, String> queryParams,\r
+    private AbstractCommonList search(\r
+               MultivaluedMap<String, String> queryParams,\r
+               String orderBy,\r
                String keywords,\r
                String advancedSearch,\r
                String partialTerm) {\r
-            ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx;\r
-            AbstractCommonList result = null;\r
-                       try {\r
-                               ctx = createServiceContext(queryParams);\r
-                       DocumentHandler handler = createDocumentHandler(ctx);\r
-                               result = search(ctx, handler, queryParams, keywords, advancedSearch, partialTerm);\r
-                       } catch (Exception e) {\r
-                   throw bigReThrow(e, ServiceMessages.SEARCH_FAILED);\r
-                       }\r
-            return result;\r
+       AbstractCommonList result = null;\r
+\r
+       ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx;\r
+       try {\r
+               ctx = createServiceContext(queryParams);\r
+               DocumentHandler handler = createDocumentHandler(ctx);\r
+               result = search(ctx, handler, queryParams, orderBy, keywords, advancedSearch, partialTerm);\r
+       } catch (Exception e) {\r
+               throw bigReThrow(e, ServiceMessages.SEARCH_FAILED);\r
+       }\r
+\r
+       return result;\r
     }\r
     \r
     //FIXME: REM - This should not be @Deprecated since we may want to implement this -it has been on the wish list.\r
index 1ff4415eaae177a9b7c6473e0e65a53977cf29a1..c839030a60a6e5281de3c501f7910bcef76b8cc1 100644 (file)
@@ -274,7 +274,7 @@ public class DocumentFilter {
         }\r
         // Set the order by clause\r
         String orderByStr = null;\r
-        List<String> list = theQueryParams.get(IClientQueryParams.SORT_BY_PARAM);\r
+        List<String> list = theQueryParams.get(IClientQueryParams.ORDER_BY_PARAM);\r
         if (list != null) {\r
             orderByStr = list.get(0);\r
         }\r
index d5ecc330512465ad7f39ba9e3b6dd4ad2c322019..61715b354438755b1937e7ce80c17210353e0556 100644 (file)
@@ -339,7 +339,7 @@ public class QueryManagerNuxeoImpl implements IQueryManager {
        public String createWhereClauseToFilterFromStringList(String qualifiedField, String[] filterTerms, boolean fExclude) {\r
        // Start with the qualified termStatus field\r
        StringBuilder filterClause = new StringBuilder(qualifiedField);\r
-       if(filterTerms.length == 1) {\r
+       if (filterTerms.length == 1) {\r
                filterClause.append(fExclude?" <> '":" = '");\r
                filterClause.append(filterTerms[0]);\r
                filterClause.append('\'');  \r
index abf6e796db90ae25891b009d6aec21377048ffaf..b8cdda1a5d3b65cd253cf7a990e8907e48c7f9bf 100644 (file)
@@ -38,7 +38,9 @@ import org.collectionspace.services.client.IRelationsManager;
 import org.collectionspace.services.common.ReflectionMapper;\r
 import org.collectionspace.services.common.api.GregorianCalendarDateTimeUtils;\r
 import org.collectionspace.services.common.api.Tools;\r
+import org.collectionspace.services.common.config.ServiceConfigUtils;\r
 import org.collectionspace.services.common.context.AbstractServiceContextImpl;\r
+import org.collectionspace.services.common.context.ServiceContext;\r
 import org.collectionspace.services.common.document.DocumentException;\r
 import org.collectionspace.services.common.document.DocumentWrapper;\r
 import org.collectionspace.services.common.query.QueryContext;\r
@@ -110,7 +112,8 @@ public abstract class DocHandlerBase<T> extends RemoteDocumentModelHandlerImpl<T
      */\r
     public AbstractCommonList createAbstractCommonListImpl() throws Exception {\r
         //  String classname = this.commonList.getClass().getName();\r
-        String classname = getDocHandlerParams().getAbstractCommonListClassname();\r
+       ServiceContext ctx = this.getServiceContext();\r
+        String classname = ServiceConfigUtils.getDocHandlerParams(ctx).getAbstractCommonListClassname();\r
         if (classname == null){\r
             throw new Exception("in createAbstractCommonListImpl. getDocHandlerParams().getAbstractCommonListClassname() is null");\r
         }\r
@@ -121,24 +124,29 @@ public abstract class DocHandlerBase<T> extends RemoteDocumentModelHandlerImpl<T
 \r
     /** DocHandlerBase calls this method with the CSID as id */\r
     public Object createItemForCommonList(DocumentModel docModel, String label, String id) throws Exception {\r
-        return createItemForCommonList(getDocHandlerParams().getCommonListItemClassname(),\r
+       ServiceContext ctx = this.getServiceContext();\r
+        return createItemForCommonList(ServiceConfigUtils.getDocHandlerParams(ctx).getCommonListItemClassname(),\r
                        docModel, label, id, true);\r
     }\r
 \r
     public String getSummaryFields(AbstractCommonList theCommonList) throws DocumentException {\r
-        return getDocHandlerParams().getSummaryFields();\r
+       ServiceContext ctx = this.getServiceContext();\r
+        return ServiceConfigUtils.getDocHandlerParams(ctx).getSummaryFields();\r
     }\r
 \r
     public void setListItemArrayExtended(boolean isExtended) throws DocumentException {\r
-       getDocHandlerParams().getListResultsFields().setExtended(isExtended);\r
+       ServiceContext ctx = this.getServiceContext();\r
+       ServiceConfigUtils.getDocHandlerParams(ctx).getListResultsFields().setExtended(isExtended);\r
     }\r
     \r
     public boolean isListItemArrayExtended() throws DocumentException {\r
-               return getDocHandlerParams().getListResultsFields().isExtended();\r
+       ServiceContext ctx = this.getServiceContext();\r
+               return ServiceConfigUtils.getDocHandlerParams(ctx).getListResultsFields().isExtended();\r
     }\r
     \r
     public List<ListResultField> getListItemsArray() throws DocumentException {\r
-        return getDocHandlerParams().getListResultsFields().getListResultField();\r
+       ServiceContext ctx = this.getServiceContext();\r
+        return ServiceConfigUtils.getDocHandlerParams(ctx).getListResultsFields().getListResultField();\r
     }\r
 \r
     @Override\r
@@ -270,7 +278,8 @@ public abstract class DocHandlerBase<T> extends RemoteDocumentModelHandlerImpl<T
     // TODO - get rid of this if we can - appears to be unused.\r
     @Override\r
     public String getQProperty(String prop) throws DocumentException {\r
-        return getDocHandlerParams().getSchemaName() + ":" + prop;\r
+       ServiceContext ctx = this.getServiceContext();\r
+        return ServiceConfigUtils.getDocHandlerParams(ctx).getSchemaName() + ":" + prop;\r
     }\r
 \r
     //============= dublin core handling =======================================\r
@@ -294,13 +303,13 @@ public abstract class DocHandlerBase<T> extends RemoteDocumentModelHandlerImpl<T
     protected void fillDublinCoreObject(DocumentWrapper<DocumentModel> wrapDoc) throws Exception {\r
        DocHandlerParams.Params docHandlerParams = null;\r
        try {\r
-               docHandlerParams = getDocHandlerParams();\r
+               docHandlerParams = ServiceConfigUtils.getDocHandlerParams(getServiceContext());\r
        } catch (Exception e) {\r
                logger.warn(e.getMessage());\r
        }\r
        \r
        if (docHandlerParams != null) {\r
-               String title = getDocHandlerParams().getDublinCoreTitle();\r
+               String title = docHandlerParams.getDublinCoreTitle();\r
                if (Tools.isEmpty(title) == false){\r
                        DocumentModel docModel = wrapDoc.getWrappedObject();\r
                        docModel.setPropertyValue("dublincore:title", title);\r
@@ -350,8 +359,9 @@ public abstract class DocHandlerBase<T> extends RemoteDocumentModelHandlerImpl<T
      *  field for you if specified.\r
      */\r
     public List createItemsList(AbstractCommonList commonList) throws Exception {\r
+       ServiceContext ctx = this.getServiceContext();\r
         return createItemsList(commonList, \r
-                       getDocHandlerParams().getListResultsItemMethodName());\r
+                       ServiceConfigUtils.getDocHandlerParams(ctx).getListResultsItemMethodName());\r
     }\r
 \r
     /** e.g. createItemsList(commonList, "getObjectexitListItem" */\r
index acd520a31b4adfcaf2d6f60a0edb4b9ff1582567..048b7410f39a3978429a4b892f5c8593bb1ebf15 100644 (file)
@@ -156,7 +156,8 @@ public abstract class   RemoteDocumentModelHandlerImpl<T, TL>
        
        DocHandlerParams.Params params = null;
        try {
-                       params = getDocHandlerParams();
+               ServiceContext ctx = this.getServiceContext();
+                       params = ServiceConfigUtils.getDocHandlerParams(ctx);
                        Boolean bool = params.isSupportsHierarchy();
                        if (bool != null) {
                                result = bool.booleanValue();
index 3fc883d2a09e5840f52636ac1dfaa5a9aa2227d4..d5554a5d9fc6f53ad560ef2588be657eb8f45f08 100644 (file)
@@ -49,7 +49,7 @@ public interface MovementProxy extends CollectionSpaceCommonListPoxProxy {
     @GET
     @Produces({"application/xml"})
     ClientResponse<AbstractCommonList> readListSortedBy(
-        @QueryParam(IClientQueryParams.SORT_BY_PARAM) String sortFieldName);
+        @QueryParam(IClientQueryParams.ORDER_BY_PARAM) String sortFieldName);
     
     @Override
        @GET
@@ -68,5 +68,5 @@ public interface MovementProxy extends CollectionSpaceCommonListPoxProxy {
     @Produces({"application/xml"})
     ClientResponse<AbstractCommonList> keywordSearchSortedBy(
         @QueryParam(IQueryManager.SEARCH_TYPE_KEYWORDS_KW) String keywords,
-        @QueryParam(IClientQueryParams.SORT_BY_PARAM) String sortFieldName);
+        @QueryParam(IClientQueryParams.ORDER_BY_PARAM) String sortFieldName);
 }
index 9a31e066e2f9d8f2047d10d36f316754bbba2742..0ea4d843d95785065fb4fe730a0a2b59057cdc26 100644 (file)
@@ -54,7 +54,7 @@ public interface RelationProxy extends CollectionSpacePoxProxy<RelationsCommonLi
                @QueryParam(IRelationsManager.PREDICATE_QP) String predicate,
                @QueryParam(IRelationsManager.OBJECT_QP) String objectCsid,
                @QueryParam(IRelationsManager.OBJECT_TYPE_QP) String objectType,
-            @QueryParam(IClientQueryParams.SORT_BY_PARAM) String sortBy,
+            @QueryParam(IClientQueryParams.ORDER_BY_PARAM) String sortBy,
             @QueryParam(IClientQueryParams.PAGE_SIZE_PARAM) Long pageSize,
            @QueryParam(IClientQueryParams.START_PAGE_PARAM) Long pageNumber);
 }
index 002ef8cee0aa4b2e759fb8761dbab3f2df84925c..3f454e793e62c12625e43af3253244a8e6370667 100644 (file)
  */
 package org.collectionspace.services.vocabulary;
 
+import org.collectionspace.services.client.PoxPayloadIn;
+import org.collectionspace.services.client.PoxPayloadOut;
 import org.collectionspace.services.client.VocabularyClient;
 import org.collectionspace.services.common.context.ServiceBindingUtils;
+import org.collectionspace.services.common.context.ServiceContext;
 //import org.collectionspace.services.common.vocabulary.AuthorityItemJAXBSchema;
 import org.collectionspace.services.common.vocabulary.AuthorityResource;
 //import org.collectionspace.services.nuxeo.util.NuxeoUtils;
@@ -78,7 +81,7 @@ public class VocabularyResource extends
     }
        
        @Override
-       protected String getOrderByField() {
+       protected String getOrderByField(ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx) {
                String result = null;
 
                result = authorityItemCommonSchemaName + ":" + VocabularyItemJAXBSchema.DISPLAY_NAME;
@@ -87,8 +90,8 @@ public class VocabularyResource extends
        }
        
        @Override
-       protected String getPartialTermMatchField() {
-               return getOrderByField();
+       protected String getPartialTermMatchField(ServiceContext<PoxPayloadIn, PoxPayloadOut> ctx) {
+               return getOrderByField(ctx);
        }
 
        /*