Merge remote-tracking branch 'origin/develop' into tizen 10/18610/1
authorjinwooim.bae <jinwooim.bae@samsung.com>
Thu, 27 Mar 2014 07:03:56 +0000 (16:03 +0900)
committerjinwooim.bae <jinwooim.bae@samsung.com>
Thu, 27 Mar 2014 07:04:49 +0000 (16:04 +0900)
* origin/develop:
  UIB : Add error handling
  DATABIND : Remove resource leak
  UIB : Fix null point exception on CodeGenerator, PageDataSet

Change-Id: Ia18f5bdf1e2cabb1dd144afea1115455ec6ab06d
Signed-off-by: jinwooim.bae <jinwooim.bae@samsung.com>
org.tizen.webuibuilder/src/org/tizen/webuibuilder/model/io/CodeGenerator.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/model/page/PageDataSet.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/DataBindingDnDManager.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/ui/views/databinding/SetSourceDialog.java
org.tizen.webuibuilder/src/org/tizen/webuibuilder/utility/ResourceManager.java

index 64eeb89..74fcb5f 100644 (file)
@@ -169,7 +169,10 @@ public class CodeGenerator {
                DOMSource source = new DOMSource(doc);
                StreamResult result = new StreamResult(writer);
                try {
-                       getTransformer(xslt).transform(source, result);
+                       Transformer transformer = getTransformer(xslt);
+                       if (transformer != null) {
+                               transformer.transform(source, result);
+                       }
                } catch (TransformerException e) {
                        e.printStackTrace();
                }
@@ -386,7 +389,7 @@ public class CodeGenerator {
 
                Part part = rootPart.getChildOfIdPropertyValue(partId, true);
                if (part == null) {
-                   return BuilderConstants.EMPTY;
+                       return BuilderConstants.EMPTY;
                }
                String css = getCssCode(part, false);
 
index b367489..dc6ffca 100644 (file)
@@ -20,7 +20,6 @@
  *
  */
 
-
 package org.tizen.webuibuilder.model.page;
 
 import java.util.ArrayList;
@@ -33,298 +32,307 @@ import org.tizen.webuibuilder.model.Part;
 import org.tizen.webuibuilder.model.page.PageDataEvent.PageDataEventType;
 import org.tizen.webuibuilder.model.page.PageDataSetEvent.PageDataSetEventType;
 
-
 public class PageDataSet {
 
-    public enum DataDataValidateType {
-        PAGE_OK, PAGE_NOACTIVEPAGE, PAGE_MULTIACTIVEPAGE
-    };
-
-    private Part baseRootPart = null;
-
-    private List<PageData> pages = new ArrayList<PageData>();
-
-    private List<IPageDataSetListener> listeners = new ArrayList<IPageDataSetListener>();
-    private List<IPageDataSetListener> removeListeners = new ArrayList<IPageDataSetListener>();
-    private boolean processEventFlag = false;
-
-    /**
-     * Constructor.
-     * 
-     * @param project
-     *            an {@link IProject}
-     */
-    public PageDataSet() {
-
-    }
-
-    public List<PageData> getPages() {
-        return pages;
-    }
-
-    public void addPage(PageData page, String path, boolean isExistsPagePart) {
-        if (hasPageName(page.getName())) {
-            return;
-        }
-
-        page.setPagePath(path);
-        pages.add(page);
-        if (isExistsPagePart) {
-            baseRootPart.addChild(page.getPagePart(), true);
-        }
-
-        fireEvent(new PageDataSetEvent(PageDataSetEventType.PAGE_ADDED, page,
-                                       getNumberOfPages() - 1, null));
-    }
-
-    public void addPage(PageData page, String path) {
-        addPage(page, path, false);
-    }
-
-    public void addPage(int index, PageData page, String path, boolean isExistsPagePart) {
-        if (hasPageName(page.getName())) {
-            return;
-        }
-
-        page.setPagePath(path);
-        pages.add(index, page);
-        if (isExistsPagePart) {
-            baseRootPart.getChildOfId("tizen.doc").addChild(page.getPagePart(), true);
-        }
-
-        fireEvent(new PageDataSetEvent(PageDataSetEventType.PAGE_ADDED, page, index, null));
-    }
-
-    public void addPage(int index, PageData page, String path) {
-        addPage(index, page, path, false);
-    }
-
-    public void renamePage(PageData page, String newName) {
-        PageData oldPage = page;
-        page.setName(newName);
-        // if (page.getPagePath() != oldPage.getPagePath()) {
-        // // rename(oldPage.getPagePath(), page.getPagePath());
-        // }
-        // if (page.getJsPath() != oldPage.getJsPath()) {
-        // // rename(oldPage.getPagePath(), page.getPagePath());
-        // }
-        // if (page.getManagedJsPath() != oldPage.getManagedJsPath()) {
-        // // delete(oldPage.getManagedJsPath());
-        // }
-        // if (page.getCssPath() != oldPage.getCssPath()) {
-        // // delete(oldPage.getPagePath());
-        // }
-        // if (page.getHtmlPath() != oldPage.getHtmlPath()) {
-        // // delete(oldPage.getHtmlPath());
-        // }
-
-        // rebuild Managed.js, html, css
-        // .........
-
-        fireEvent(new PageDataSetEvent(PageDataSetEventType.PAGE_RENAMED, page, getPageIndex(page),
-                                       oldPage));
-    }
-
-    public void movePage(PageData page, int sourceIndex, int targetIndex) {
-        PageData pageData = pages.get(sourceIndex);
-        pages.remove(pageData);
-        pages.add(targetIndex, pageData);
-        fireEvent(new PageDataSetEvent(PageDataSetEventType.PAGE_MOVED, null, 0, null));
-    }
-
-    public int getPageIndex(String id) {
-        return getPageIndex(getPageData(id));
-    }
-
-    public int getPageIndex(PageData page) {
-        return getPages().indexOf(page);
-    }
-
-    public boolean hasPageName(String pageName) {
-        for (PageData page : getPages()) {
-            String name = page.getName();
-            if (name != null && name.equals(pageName)) {
-                return true;
-            }
-        }
-
-        return false;
-    }
-
-    public void addPageListener(IPageDataSetListener listener) {
-        listeners.add(listener);
-    }
-
-    public void removePageListener(IPageDataSetListener listener) {
-        if (!processEventFlag) {
-            listeners.remove(listener);
-        } else {
-            removeListeners.add(listener);
-        }
-    }
-
-    private void fireEvent(final PageDataSetEvent pageEvent) {
-        Display.getDefault().syncExec(new Runnable() {
-            @Override
-            public void run() {
-                fireEvent(pageEvent, listeners);
-            }
-        });
-    }
-
-    private void fireEvent(PageDataSetEvent pageEvent, List<IPageDataSetListener> listeners) {
-        Iterator<IPageDataSetListener> itr = listeners.iterator();
-        IPageDataSetListener listener = null;
-
-        processEventFlag = true;
-        while (itr.hasNext()) {
-            listener = itr.next();
-            switch (pageEvent.getType()) {
-                case ALL_PAGES_RESETED:
-                    listener.allPagesReseted(pageEvent);
-                    break;
-                case PAGE_ADDED:
-                    listener.pageAdded(pageEvent);
-                    break;
-                case PAGE_REMOVED:
-                    listener.pageRemoved(pageEvent);
-                    break;
-                case PAGE_RENAMED:
-                    listener.pageRenamed(pageEvent);
-                    break;
-                default:
-                    assert (false);
-            }
-        }
-        processEventFlag = false;
-
-        if (!removeListeners.isEmpty()) {
-            for (IPageDataSetListener removeListener : removeListeners) {
-                listeners.remove(removeListener);
-            }
-            removeListeners.clear();
-        }
-    }
-
-    public PageData getPageByIndex(int index) {
-        return getPages().get(index);
-    }
-
-    public PageData getPageByPath(String path) {
-        if (path == null) {
-            return null;
-        }
-
-        for (PageData page : getPages()) {
-            if (path.equals(page.getPagePath())) {
-                return page;
-            }
-        }
-
-        return null;
-    }
-
-    public String getPageName(int index) {
-        return getPageByIndex(index).getName();
-    }
-
-    public int getNumberOfPages() {
-        return getPages().size();
-    }
-
-    public Part getBaseRootPart() {
-        return baseRootPart;
-    }
-
-    public void setBaseRootPart(Part rootPart) {
-        baseRootPart = rootPart;
-        fireEvent(new PageDataSetEvent(PageDataSetEventType.ALL_PAGES_RESETED, null, 0, null));
-    }
-
-    /**
-     * Gets a root {@link Part} corresponding page.
-     * 
-     * @param name
-     *            a page name
-     * @return root {@link Part} if a root {@link Part} corresponding page is exist, and null
-     *         otherwise
-     */
-    public Part getRootPart(String name) {
-        PageData page = getPageData(name);
-        if (page != null) {
-            return page.getRootPart();
-        } else {
-            return null;
-        }
-    }
-
-    public Part getPagePart(String name) {
-        PageData page = getPageData(name);
-        if (page != null) {
-            return page.getPagePart();
-        } else {
-            return null;
-        }
-    }
-
-    /**
-     * Gets a {@link PageData} corresponding page.
-     * 
-     * @param index
-     *            a page index
-     * @return {@link PageData} if a {@link PageData} corresponding page is exist, and null
-     *         otherwise
-     */
-    public PageData getPageData(int index) {
-        if (index < 0 || index >= getPages().size()) {
-            return null;
-        }
-
-        return getPages().get(index);
-    }
-
-    /**
-     * Gets a {@link PageData} corresponding page.
-     * 
-     * @param name
-     *            a page name
-     * @return {@link PageData} if a {@link PageData} corresponding page is exist, and null
-     *         otherwise
-     */
-    public PageData getPageData(String name) {
-        if (name == null) {
-            return null;
-        }
-
-        for (PageData page : getPages()) {
-            if (name.equals(page.getName())) {
-                return page;
-            }
-        }
-
-        return null;
-    }
-
-    public void removePage(int index) {
-        PageData page = getPages().get(index);
-
-        page.fireEvent(new PageDataEvent(PageDataEventType.PAGE_PREDELETE, page));
-        fireEvent(new PageDataSetEvent(PageDataSetEventType.PAGE_PREDELETE, page, index, null));
-
-        pages.remove(index);
-
-        fireEvent(new PageDataSetEvent(PageDataSetEventType.PAGE_REMOVED, page, index, null));
-    }
-
-    public void removePage(PageData page) {
-        int index = getPages().indexOf(page);
-        removePage(index);
-    }
-
-    public void removeAllPages() {
-        for (int i = pages.size() - 1; i >= 0; i--) {
-            removePage(i);
-        }
-    }
+       public enum DataDataValidateType {
+               PAGE_OK, PAGE_NOACTIVEPAGE, PAGE_MULTIACTIVEPAGE
+       };
+
+       private Part baseRootPart = null;
+
+       private List<PageData> pages = new ArrayList<PageData>();
+
+       private List<IPageDataSetListener> listeners = new ArrayList<IPageDataSetListener>();
+       private List<IPageDataSetListener> removeListeners = new ArrayList<IPageDataSetListener>();
+       private boolean processEventFlag = false;
+
+       /**
+        * Constructor.
+        * 
+        * @param project
+        *            an {@link IProject}
+        */
+       public PageDataSet() {
+
+       }
+
+       public List<PageData> getPages() {
+               return pages;
+       }
+
+       public void addPage(PageData page, String path, boolean isExistsPagePart) {
+               if (hasPageName(page.getName())) {
+                       return;
+               }
+
+               page.setPagePath(path);
+               pages.add(page);
+               if (isExistsPagePart) {
+                       baseRootPart.addChild(page.getPagePart(), true);
+               }
+
+               fireEvent(new PageDataSetEvent(PageDataSetEventType.PAGE_ADDED, page,
+                               getNumberOfPages() - 1, null));
+       }
+
+       public void addPage(PageData page, String path) {
+               addPage(page, path, false);
+       }
+
+       public void addPage(int index, PageData page, String path,
+                       boolean isExistsPagePart) {
+               if (hasPageName(page.getName())) {
+                       return;
+               }
+
+               page.setPagePath(path);
+               pages.add(index, page);
+               if (isExistsPagePart) {
+                       Part docPart = baseRootPart.getChildOfId("tizen.doc");
+                       if (docPart != null) {
+                               docPart.addChild(page.getPagePart(), true);
+                       }
+               }
+
+               fireEvent(new PageDataSetEvent(PageDataSetEventType.PAGE_ADDED, page,
+                               index, null));
+       }
+
+       public void addPage(int index, PageData page, String path) {
+               addPage(index, page, path, false);
+       }
+
+       public void renamePage(PageData page, String newName) {
+               PageData oldPage = page;
+               page.setName(newName);
+               // if (page.getPagePath() != oldPage.getPagePath()) {
+               // // rename(oldPage.getPagePath(), page.getPagePath());
+               // }
+               // if (page.getJsPath() != oldPage.getJsPath()) {
+               // // rename(oldPage.getPagePath(), page.getPagePath());
+               // }
+               // if (page.getManagedJsPath() != oldPage.getManagedJsPath()) {
+               // // delete(oldPage.getManagedJsPath());
+               // }
+               // if (page.getCssPath() != oldPage.getCssPath()) {
+               // // delete(oldPage.getPagePath());
+               // }
+               // if (page.getHtmlPath() != oldPage.getHtmlPath()) {
+               // // delete(oldPage.getHtmlPath());
+               // }
+
+               // rebuild Managed.js, html, css
+               // .........
+
+               fireEvent(new PageDataSetEvent(PageDataSetEventType.PAGE_RENAMED, page,
+                               getPageIndex(page), oldPage));
+       }
+
+       public void movePage(PageData page, int sourceIndex, int targetIndex) {
+               PageData pageData = pages.get(sourceIndex);
+               pages.remove(pageData);
+               pages.add(targetIndex, pageData);
+               fireEvent(new PageDataSetEvent(PageDataSetEventType.PAGE_MOVED, null,
+                               0, null));
+       }
+
+       public int getPageIndex(String id) {
+               return getPageIndex(getPageData(id));
+       }
+
+       public int getPageIndex(PageData page) {
+               return getPages().indexOf(page);
+       }
+
+       public boolean hasPageName(String pageName) {
+               for (PageData page : getPages()) {
+                       String name = page.getName();
+                       if (name != null && name.equals(pageName)) {
+                               return true;
+                       }
+               }
+
+               return false;
+       }
+
+       public void addPageListener(IPageDataSetListener listener) {
+               listeners.add(listener);
+       }
+
+       public void removePageListener(IPageDataSetListener listener) {
+               if (!processEventFlag) {
+                       listeners.remove(listener);
+               } else {
+                       removeListeners.add(listener);
+               }
+       }
+
+       private void fireEvent(final PageDataSetEvent pageEvent) {
+               Display.getDefault().syncExec(new Runnable() {
+                       @Override
+                       public void run() {
+                               fireEvent(pageEvent, listeners);
+                       }
+               });
+       }
+
+       private void fireEvent(PageDataSetEvent pageEvent,
+                       List<IPageDataSetListener> listeners) {
+               Iterator<IPageDataSetListener> itr = listeners.iterator();
+               IPageDataSetListener listener = null;
+
+               processEventFlag = true;
+               while (itr.hasNext()) {
+                       listener = itr.next();
+                       switch (pageEvent.getType()) {
+                       case ALL_PAGES_RESETED:
+                               listener.allPagesReseted(pageEvent);
+                               break;
+                       case PAGE_ADDED:
+                               listener.pageAdded(pageEvent);
+                               break;
+                       case PAGE_REMOVED:
+                               listener.pageRemoved(pageEvent);
+                               break;
+                       case PAGE_RENAMED:
+                               listener.pageRenamed(pageEvent);
+                               break;
+                       default:
+                               assert (false);
+                       }
+               }
+               processEventFlag = false;
+
+               if (!removeListeners.isEmpty()) {
+                       for (IPageDataSetListener removeListener : removeListeners) {
+                               listeners.remove(removeListener);
+                       }
+                       removeListeners.clear();
+               }
+       }
+
+       public PageData getPageByIndex(int index) {
+               return getPages().get(index);
+       }
+
+       public PageData getPageByPath(String path) {
+               if (path == null) {
+                       return null;
+               }
+
+               for (PageData page : getPages()) {
+                       if (path.equals(page.getPagePath())) {
+                               return page;
+                       }
+               }
+
+               return null;
+       }
+
+       public String getPageName(int index) {
+               return getPageByIndex(index).getName();
+       }
+
+       public int getNumberOfPages() {
+               return getPages().size();
+       }
+
+       public Part getBaseRootPart() {
+               return baseRootPart;
+       }
+
+       public void setBaseRootPart(Part rootPart) {
+               baseRootPart = rootPart;
+               fireEvent(new PageDataSetEvent(PageDataSetEventType.ALL_PAGES_RESETED,
+                               null, 0, null));
+       }
+
+       /**
+        * Gets a root {@link Part} corresponding page.
+        * 
+        * @param name
+        *            a page name
+        * @return root {@link Part} if a root {@link Part} corresponding page is
+        *         exist, and null otherwise
+        */
+       public Part getRootPart(String name) {
+               PageData page = getPageData(name);
+               if (page != null) {
+                       return page.getRootPart();
+               } else {
+                       return null;
+               }
+       }
+
+       public Part getPagePart(String name) {
+               PageData page = getPageData(name);
+               if (page != null) {
+                       return page.getPagePart();
+               } else {
+                       return null;
+               }
+       }
+
+       /**
+        * Gets a {@link PageData} corresponding page.
+        * 
+        * @param index
+        *            a page index
+        * @return {@link PageData} if a {@link PageData} corresponding page is
+        *         exist, and null otherwise
+        */
+       public PageData getPageData(int index) {
+               if (index < 0 || index >= getPages().size()) {
+                       return null;
+               }
+
+               return getPages().get(index);
+       }
+
+       /**
+        * Gets a {@link PageData} corresponding page.
+        * 
+        * @param name
+        *            a page name
+        * @return {@link PageData} if a {@link PageData} corresponding page is
+        *         exist, and null otherwise
+        */
+       public PageData getPageData(String name) {
+               if (name == null) {
+                       return null;
+               }
+
+               for (PageData page : getPages()) {
+                       if (name.equals(page.getName())) {
+                               return page;
+                       }
+               }
+
+               return null;
+       }
+
+       public void removePage(int index) {
+               PageData page = getPages().get(index);
+
+               page.fireEvent(new PageDataEvent(PageDataEventType.PAGE_PREDELETE, page));
+               fireEvent(new PageDataSetEvent(PageDataSetEventType.PAGE_PREDELETE,
+                               page, index, null));
+
+               pages.remove(index);
+
+               fireEvent(new PageDataSetEvent(PageDataSetEventType.PAGE_REMOVED, page,
+                               index, null));
+       }
+
+       public void removePage(PageData page) {
+               int index = getPages().indexOf(page);
+               removePage(index);
+       }
+
+       public void removeAllPages() {
+               for (int i = pages.size() - 1; i >= 0; i--) {
+                       removePage(i);
+               }
+       }
 
 }
index f2044f2..f753ae3 100644 (file)
@@ -254,7 +254,11 @@ public class DataBindingDnDManager {
             }
             
             public void drop(DropTargetEvent event) {
-                if ((event == null) || (event.data == null)) {
+               if (event == null) {
+                       return;
+               }
+               
+                if (event.data == null) {
                     event.detail = DND.DROP_NONE;
                     return;
                 }
@@ -280,7 +284,6 @@ public class DataBindingDnDManager {
                         if (parent != null) {
                             event.detail = DND.DROP_NONE;
                         } else {
-//                           
                                BindingData viewModel = dataBindingPage.getViewModel(item.getText());
                                BindingData dataSource = dataBindingPage.getDataSource(sourceItem.getText());
                                dataBindingPage.setDataSourceToViewModel(dataSource, viewModel);
@@ -292,14 +295,13 @@ public class DataBindingDnDManager {
                     }
                 } else if (ViewModelTreeItemTransfer.getInstance()
                         .isSupportedType(event.currentDataType)) {
-                    // if ((event.item != null) &&
-                    // (getRootItemFromTree((TreeItem)
-                    // event.item).getData("SOURCETYPE").equals("STATIC"))) {
-                    TreeItemData treeItemData =
-                            (TreeItemData) getRootItemFromTree((TreeItem) event.item)
-                                    .getData("TREEITEMDATA");
-                    BindingData dataModel = (BindingData) treeItemData.getModel();
-                    if ((event.item != null) && (dataModel != null) && (dataModel.getModelType().equals("STATIC"))) {
+                       BindingData dataModel = null;
+                       if (event.item != null) {
+                               TreeItemData treeItemData =
+                                               (TreeItemData) getRootItemFromTree((TreeItem) event.item).getData("TREEITEMDATA");
+                       dataModel = (BindingData) treeItemData.getModel();
+                       }
+                    if ((dataModel != null) && (dataModel.getModelType().equals("STATIC"))) {
                         TreeItem item = (TreeItem) event.item;
                         Point pt = tree.getDisplay().map(null, tree, event.x, event.y);
                         Rectangle bounds = item.getBounds();
index cf16f72..7c802fc 100644 (file)
@@ -1420,13 +1420,17 @@ public class SetSourceDialog extends Dialog {
         return importGroup;
     }
 
-    private static String readAll(Reader rd) throws IOException {
+    private static String readAll(Reader rd){
         StringBuilder sb = new StringBuilder();
         int cp;
-        while ((cp = rd.read()) != -1) {
-            sb.append((char) cp);
-        }
-        rd.close();
+        try {
+                       while ((cp = rd.read()) != -1) {
+                           sb.append((char) cp);
+                       }
+               } catch (IOException e) {
+                       e.printStackTrace();
+               }
+        //rd.close();
         return sb.toString();
     }
 
@@ -1458,17 +1462,14 @@ public class SetSourceDialog extends Dialog {
         BufferedReader rd;
                try {
                        rd = new BufferedReader(new FileReader(file));
-                       String jsonText;
-                       try {
-                               jsonText = readAll(rd);
-                               JSONObject json = (JSONObject) JSONValue.parse(jsonText);
-                       return json;
-                       } catch (IOException e) {
-                               return null;
-                       }
-               
+                       String jsonText = readAll(rd);
+                       JSONObject json = (JSONObject) JSONValue.parse(jsonText);
+                       rd.close();
+               return json;
                } catch (FileNotFoundException e) {
                        return null;
+               } catch (IOException e) {
+                       return null;
                }
     }
 
index 1d0ff90..9b6d40d 100644 (file)
@@ -35,20 +35,17 @@ import org.eclipse.jface.resource.ImageDescriptor;
 import org.eclipse.jface.resource.ImageRegistry;
 import org.eclipse.swt.graphics.Image;
 import org.eclipse.ui.plugin.AbstractUIPlugin;
-import org.tizen.common.util.Assert;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.tizen.common.util.IOUtil;
 import org.tizen.webuibuilder.BuilderConstants;
 import org.tizen.webuibuilder.BuilderPlugin;
 
 
-/**
- * ResourceManager
- * 
- * @author hwani
- * 
- */
 public class ResourceManager {
     private static final String ID = BuilderPlugin.PLUGIN_ID;
     private static ImageRegistry imageRegistry = BuilderPlugin.getDefault().getImageRegistry();
+    protected static final Logger logger = LoggerFactory.getLogger(ResourceManager.class);
 
     private ResourceManager() {
     }
@@ -110,7 +107,6 @@ public class ResourceManager {
      * @return URL of resource file
      */
     public static URL getResource(String name) {
-        Assert.notNull(name);
         return BuilderPlugin.getDefault().getBundle().getResource(name);
     }
 
@@ -128,16 +124,27 @@ public class ResourceManager {
     /**
      * 
      * @param name
-     *            resource name
-     * @return String of resource file
-     * @throws IOException
+     *            resource name (bundle relative path)
+     * @return String of resource file (or null)
      */
-    public static String getString(String name) throws IOException {
-        InputStream stream = openStream(name);
-        int length = stream.available();
-        byte[] buffer = new byte[length];
-        stream.read(buffer);
-        return new String(buffer);
+    public static String getString(String name) {
+        InputStream stream = null;
+        try {
+            stream = openStream(name);
+            int length = stream.available();
+            if (length > 4096) {
+                logger.warn("Resource file is too large");
+            }
+            byte[] buffer = new byte[length];
+            int readLength = stream.read(buffer);
+            if (readLength == -1) {
+                logger.warn("End of file");
+            }
+            return new String(buffer);
+        } catch (IOException e) {
+            IOUtil.tryClose(stream);
+            return null;
+        }
     }
 
     /**