Solved

Passing a map to a different class

Posted on 2011-09-13
21
444 Views
Last Modified: 2012-05-12
I have a populated map in my Handler class file.  I need to pass the map from the Handler class file to my dialog class file.  Do you use a constructor?  - What is the best way to make that map and its value more global?
0
Comment
Question by:jkteater
  • 10
  • 10
21 Comments
 
LVL 47

Expert Comment

by:for_yan
ID: 36529756
Map instance  is the same object as anyhthing else - you can pas it through constructor or tghrough get-set methoid - whatever is nore convenient to yiou.
0
 

Author Comment

by:jkteater
ID: 36529912
can you show me an example on how to do it?
0
 
LVL 47

Expert Comment

by:for_yan
ID: 36530017
In the constructor:
Suppose this is the code in classA and you are passing it to classB:

HashMap <String,String> m = new HshMap<String,Striung>();
// populate m with say put() calss
ClassB cb = new ClassB(m);
...

The ClassB code:

public ClassB {
HashMap<String,String> m;
public ClassB(HashMap<String,String> m) {
this.m = m;
...
}
0
 
LVL 47

Expert Comment

by:for_yan
ID: 36530081
Throuh the setMethod - the begging in the classA will b e the same - you create and populate hasmap

Then yoiujust call

ClassB clb = new ClassB();
clb.setMap(m);

..,

And in ClassB you should
proviede method

public void setMap(HashMap<String,String> m) {
this.m = m;
}

Of course you should decalr m as an instance variable of class B as I showed with the above constructor

0
 
LVL 47

Expert Comment

by:for_yan
ID: 36530099
The third variant will be to provide
 public HashMap<String,String> getMap()
Methid in the ClassA and call this methid from classB - all in all this is no different than pasing a String
0
 

Author Comment

by:jkteater
ID: 36530129
I think the problem I am having is my map is in a class that does not call another class.  The class file I am wanting the map sent to is being called by a different class.

I have 3 different classes

Class GetMapValue - has the map - but does not call any other classes - only there to get the values for the map

Class CallDialog - calls Class TableInput

Class TableInlut - this is the class I need to get the map to

Does this make sense to you?
0
 

Author Comment

by:jkteater
ID: 36530232
But I must add that Class GetMapValue is in the Handler dir
Class TableInlut  is in the Dialogs dir
0
 
LVL 1

Expert Comment

by:mallesh_np
ID: 36530303
I think you are talking about package. Just import handler.GetMapValue into Class TableInlut.
0
 
LVL 47

Expert Comment

by:for_yan
ID: 36530329
All these things are usually not a problem - maybe you can post some stripped off snippets of your classes
What means "class does not call other class" ?
Classes do not call classes.
You may probably rather say that one class has an instance of another class as a field.
Can you change the code of those classes?
sometimes you want to have one of the callses keep instances of other two classes, so that you can pass variables through that class - it mostly depends
on convenience

what is class in dir ?

You mean it belongs to differen package?
This does not matter - you can have an instance of one class in another class which is in deifferent package
0
 

Author Comment

by:jkteater
ID: 36530405
Here is the class file that creating the map and getting the values
package com.ediua.handlers;

import java.util.*;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;
import org.eclipse.jface.dialogs.MessageDialog;
import org.eclipse.jface.viewers.ISelection;
import org.eclipse.jface.viewers.IStructuredSelection;
import org.eclipse.ui.handlers.HandlerUtil;
import org.eclipse.swt.widgets.Display;

import com.teamcenter.rac.aif.kernel.AIFComponentContext;
import com.teamcenter.rac.kernel.TCComponent;
import com.teamcenter.rac.kernel.TCException;


public class ediHandler extends AbstractHandler {
   private List<TCComponent>    revisionList;
   private List<TCComponent>    datasetList;
     
   public ediHandler() {
      // TODO Auto-generated constructor stub
   revisionList = new ArrayList<TCComponent>();
   datasetList = new ArrayList<TCComponent>();
   
   }
   
   String dataType[] = {"ItemRevision"}; 
   String dataRelation[] = {"IMAN_specification"};
   
   @Override
   public Object execute(final ExecutionEvent event) throws ExecutionException {
      ISelection sel = HandlerUtil.getActiveWorkbenchWindow(event).getActivePage().getSelection();
      final StringBuilder objectsSelected = new StringBuilder();
      objectsSelected.append("Here are the objects selected:\n");
      Map <TCComponent, TCComponent> map = new HashMap<TCComponent, TCComponent>();      
      if ((sel != null) && (sel instanceof IStructuredSelection)) {
	         IStructuredSelection structSelection = (IStructuredSelection) sel;
	         for (Iterator<?> iter = structSelection.iterator(); iter.hasNext();) {
	        	 AIFComponentContext element =  (AIFComponentContext) iter.next();
	        	 TCComponent selectedDataset = (TCComponent) element.getComponent();
	        	 //TCComponent selectedDatasetType = selectedDataset.getTypeComponent();
	        	 AIFComponentContext[] selectedRevisions;
	        	 try {
	        		selectedRevisions =  selectedDataset.whereReferencedByTypeRelation(dataType, dataRelation);
	        		int size = selectedRevisions.length;
	        		//objectsSelected.append("Size: " + size + "\n");
	        		System.out.println("size" + size + "\n");
					//objectsSelected.append("Parent Type:  " + Arrays.toString(selectedRevisions) + "\n");
					if (size == 1) {
					TCComponent tcDataset = (TCComponent) selectedRevisions[0].getComponent();
					   revisionList.add(tcDataset);	
					   map.put(tcDataset,selectedDataset);
					}
		            else {
		        		System.out.println("Terminate\n");
		        	    continue;
		        	}										
				} 
				catch (TCException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
	        	 /*TCComponent parentType =  selectedParent.getTypeComponent();*/
	        	
				
				datasetList.add(selectedDataset);
	        }	         
      }
      /*   
      Iterator<?> it = revisionList.iterator();
      while (it.hasNext()){
      objectsSelected.append(it.next()+" ");  
      }
      
      Iterator<?> is = datasetList.iterator();
      while (is.hasNext()){
      objectsSelected.append(is.next()+" ");  
      }
      */
      Set<?> entries = map.entrySet();
      Iterator<?> iterator = entries.iterator();
      while (iterator.hasNext()) {
        Map.Entry entry = (Map.Entry)iterator.next();
        objectsSelected.append("Key : " + entry.getKey() + " : Value "
          + entry.getValue() + "\n");
      }
     
      Display.getDefault().asyncExec(new Runnable() {
         public void run() {
            MessageDialog.openInformation(HandlerUtil.getActiveShell(event), "ediHandler", objectsSelected.toString());
         }
      });
      
/*
      IWorkbenchWindow window = HandlerUtil.getActiveWorkbenchWindowChecked(event);
      MessageDialog.openInformation(
            window.getShell(),
            "UnprereleaseHandler",
            "Hello, from UnprereleaseHandler");
*/
      return null;
   }
}

Open in new window


This is the class that is calling the dialog with the JTable

package com.ediua.handlers;

import org.eclipse.core.commands.AbstractHandler;
import org.eclipse.core.commands.ExecutionEvent;
import org.eclipse.core.commands.ExecutionException;


import com.ediua.dialogs.ediBaseDialog;


public class ediDialogHandler extends AbstractHandler {
   
     
   public ediDialogHandler() {
      // TODO Auto-generated constructor stub
	   
   }
       
   @Override
   public Object execute(final ExecutionEvent event) throws ExecutionException {
	   showediDialog();
	   
	   return null;
   }
   private void showediDialog() {
		 ediBaseDialog ar = new ediBaseDialog();
		 ar.setModal(false);
	  	 ar.setVisible(true);  
	    }    

}

Open in new window


This is the class I need to get the map and values to
package com.lexmark.ediua.dialogs;

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.ComponentAdapter;
import java.awt.event.ComponentEvent;
import javax.swing.*;
import com.teamcenter.rac.aif.AbstractAIFDialog;


public class ediBaseDialog extends AbstractAIFDialog{
   private static final long serialVersionUID = 1L;
   private JPanel centerPanel = null; 
   private JTable selectTable = null;
   
   public ediBaseDialog(){
      
	   createDialog();
   } // end constructor
    
   public void createDialog() {
	  Component selectionsPanel = selectedTable();
   	  Component buttonPanel = OKCancelButtons();
   	  Component currentPanel = currentItems();
   	  centerPanel = new JPanel();
      centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.PAGE_AXIS));
      centerPanel.setPreferredSize(new Dimension(750, 350));
            
      centerPanel.add(Box.createRigidArea(new Dimension(5, 0)));
      centerPanel.add(currentPanel);
      centerPanel.add(selectionsPanel);
      centerPanel.add(Box.createHorizontalGlue());
      centerPanel.add(Box.createRigidArea(new Dimension(0, 2)));
      centerPanel.add(buttonPanel);
      
      getContentPane().add(centerPanel);
      
      addComponentListener(new ComponentAdapter() {
        public void componentResized(ComponentEvent event) {
           Component c = event.getComponent();
           c.setSize(Math.max((int)centerPanel.getPreferredSize().getWidth()/2, c.getWidth()),
                     Math.max((int)centerPanel.getPreferredSize().getHeight()/2, c.getHeight()));
        }
      });
  	  	
      this.pack();
      setLocation(getParent().getLocation(null));        
              
// 	Display the window.
      centerPanel.setVisible(true);
      
   }

//////////////////////////////////////////////////////////////////////////
//                                                                      //
//                        OKCancelButtons()                             //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

private JPanel OKCancelButtons() {
   JButton okButton = new JButton("Submit");
   okButton.setEnabled(true);
   okButton.addActionListener(new ActionListener() {
   
      public void actionPerformed(ActionEvent e) {
         dispose();
      }
   });

   JButton cancelButton = new JButton("Cancel");
   cancelButton.setEnabled(true);
   cancelButton.addActionListener(new ActionListener() {
      
	   public void actionPerformed(ActionEvent e) {
          dispose();
       }
   });

   JPanel p = new JPanel();
   p.setBorder(BorderFactory.createLineBorder(Color.red));
   p.setLayout(new BoxLayout(p, BoxLayout.LINE_AXIS));
   p.add(Box.createHorizontalGlue());
   p.add(okButton);
   p.add(cancelButton);

return p;
}

//////////////////////////////////////////////////////////////////////////
//                                                                      //
//set_gbc()                                                             //
//GridBagConstraints                                                    //
//////////////////////////////////////////////////////////////////////////

   GridBagConstraints gbc = new GridBagConstraints();
   protected boolean alreadyEnabled;

   private void set_gbc(int row, int column, int width, int height, int fill) {
      gbc.gridy = row;
      gbc.gridx = column;
      gbc.gridwidth = width;
      gbc.gridheight = height;
      gbc.fill = fill;   // GridBagConstraints.NONE .HORIZONTAL .VERTICAL .BOTH
}
//////////////////////////////////////////////////////////////////////////
//                                                                      //
//                             selectedTable()                             //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

   private JPanel selectedTable(){
	
	JLabel tLabel = new JLabel("Selections");
		
	JPanel p = new JPanel();
    p.setBorder(BorderFactory.createLineBorder(Color.blue));
    GridBagLayout gridbag = new GridBagLayout();
    p.setLayout(gridbag);
    
    
 // Create columns names
	String columnNames[] = { "Item ID", "Rev ID", "PRL", "Dataset", "EC Markup Included" };
    
// Create some data
	String dataValues[][] =
	{
		{ "1", "2", "3", "4", "5" },
		{ "6", "7", "8", "9", "10" },
		{ "93", "89.2", "109", "11", "12"}
	};   
	
	// Create a new table instance
	selectTable = new JTable( dataValues, columnNames );
	selectTable.setAutoResizeMode(JTable.AUTO_RESIZE_ALL_COLUMNS);
	selectTable.setCellSelectionEnabled(false);
	selectTable.setRowSelectionAllowed(true);
	selectTable.setColumnSelectionAllowed(false);
	//selectTable.setMinimumSize(table.getPreferredSize());

	// Add the table to a scrolling pane
	 JScrollPane ScrollPane = new JScrollPane(selectTable);
	 
	 
	   
	gbc.insets = new Insets(5,10,10,5);      
    set_gbc(0, 0, 1, 1,GridBagConstraints.BOTH );
    gridbag.setConstraints(tLabel, gbc);
    p.add(tLabel);
	
    gbc.gridx = 0;
    gbc.gridy = 1;
    gbc.gridwidth = GridBagConstraints.REMAINDER;
    gbc.gridheight = 1;
    gbc.weightx = 1;
    gbc.weighty = 1;
    gbc.fill = GridBagConstraints.BOTH; 
    //set_gbc(0, 1, 1, 1,GridBagConstraints.BOTH );
    //gridbag.setConstraints(ScrollPane, gbc);
    
    p.add(ScrollPane,gbc);
    
    return p;
}


//////////////////////////////////////////////////////////////////////////
//                                                                      //
//                        currentItems()                                 //
//                                                                      //
//////////////////////////////////////////////////////////////////////////

private JPanel currentItems(){
	
	JLabel eLabel = new JLabel("Current Project");
	JLabel threeLabel = new JLabel("3D Translators");
	JLabel twoLabel = new JLabel("2D Translators");
	JLabel emailLabel = new JLabel("Emails");
	final JTextField curProject = new JTextField(20);
	final JTextField cur3dTrans = new JTextField(20);
	final JTextField cur2dTrans = new JTextField(20);
	final JTextField curEmails = new JTextField(20);
	
	final JButton projectButton = new JButton("Change");
     //projectButton.setBackground(Color.red);
     //projectButton.setForeground(Color.red); 
     projectButton.setPreferredSize(new Dimension(100, 20));
     projectButton.setEnabled(true);
     projectButton.addActionListener(
     new ActionListener() {
        public void actionPerformed( ActionEvent event )
       {
        	dispose();   
       }           
      });
     final JButton threeDButton = new JButton("Change");
     //projectButton.setBackground(Color.red);
     //projectButton.setForeground(Color.red); 
     threeDButton.setPreferredSize(new Dimension(100, 20));
     threeDButton.setEnabled(true);
     threeDButton.addActionListener(
     new ActionListener() {
        public void actionPerformed( ActionEvent event )
       {
        	dispose();   
       }           
      });
     final JButton twoDButton = new JButton("Change");
     //projectButton.setBackground(Color.red);
     //projectButton.setForeground(Color.red); 
     twoDButton.setPreferredSize(new Dimension(100, 20));
     twoDButton.setEnabled(true);
     twoDButton.addActionListener(
     new ActionListener() {
        public void actionPerformed( ActionEvent event )
       {
        	dispose();   
       }           
      });
     final JButton emailButton = new JButton("Change");
     //projectButton.setBackground(Color.red);
     //projectButton.setForeground(Color.red); 
     emailButton.setPreferredSize(new Dimension(100, 20));
     emailButton.setEnabled(true);
     emailButton.addActionListener(
     new ActionListener() {
        public void actionPerformed( ActionEvent event )
       {
        	dispose();   
       }           
      });
		
	JPanel p = new JPanel();
    p.setBorder(BorderFactory.createLineBorder(Color.green));
    GridBagLayout gridbag = new GridBagLayout();
    p.setLayout(gridbag);
    
    gbc.insets = new Insets(5,10,10,5);      
    set_gbc(0, 0, 1, 1,GridBagConstraints.HORIZONTAL );
    gridbag.setConstraints(eLabel, gbc);
    p.add(eLabel);
    
    set_gbc(1, 0, 1, 1,GridBagConstraints.HORIZONTAL );
    gridbag.setConstraints(threeLabel, gbc);
    p.add(threeLabel);
    
    set_gbc(2, 0, 1, 1,GridBagConstraints.HORIZONTAL );
    gridbag.setConstraints(twoLabel, gbc);
    p.add(twoLabel);
    
    set_gbc(3, 0, 1, 1,GridBagConstraints.HORIZONTAL );
    gridbag.setConstraints(emailLabel, gbc);
    p.add(emailLabel);
    
    set_gbc(0, 1, 1, 1,GridBagConstraints.HORIZONTAL);
    gridbag.setConstraints(curProject, gbc);
    p.add(curProject);
    
    set_gbc(1, 1, 1, 1,GridBagConstraints.HORIZONTAL);
    gridbag.setConstraints(cur3dTrans, gbc);
    p.add(cur3dTrans);
    
    set_gbc(2, 1, 1, 1,GridBagConstraints.HORIZONTAL);
    gridbag.setConstraints(cur2dTrans, gbc);
    p.add(cur2dTrans);
    
    set_gbc(3, 1, 1, 1,GridBagConstraints.HORIZONTAL);
    gridbag.setConstraints(curEmails, gbc);
    p.add(curEmails);
    
    set_gbc(0, 2, 1, 1, GridBagConstraints.BOTH);
    gridbag.setConstraints(projectButton, gbc);
    p.add(projectButton);
    
    set_gbc(1, 2, 1, 1, GridBagConstraints.BOTH);
    gridbag.setConstraints(threeDButton, gbc);
    p.add(threeDButton);
    
    set_gbc(2, 2, 1, 1, GridBagConstraints.BOTH);
    gridbag.setConstraints(twoDButton, gbc);
    p.add(twoDButton);
    
    set_gbc(3, 2, 1, 1, GridBagConstraints.BOTH);
    gridbag.setConstraints(emailButton, gbc);
    p.add(emailButton);
    return p;
}

Open in new window

0
What Should I Do With This Threat Intelligence?

Are you wondering if you actually need threat intelligence? The answer is yes. We explain the basics for creating useful threat intelligence.

 
LVL 47

Expert Comment

by:for_yan
ID: 36530756
OK, let's return to your previous message:

>Class GetMapValue - has the map - but does not call any other classes - only there to get the values for the map

>Class CallDialog - calls Class TableInput

>Class TableInlut - this is the class I need to get the map to


So do I understand it correctly that you main action is
happenuing in CallDialog - it first calls method
of the class GetMapVlaue to create the map and
then instatitates class TableInput which should use this map
to create the JTable - is this correct understanding ?

0
 
LVL 47

Accepted Solution

by:
for_yan earned 125 total points
ID: 36530855


If my above understanding is correct then the overall scheme
may be like that:

in the code of CallDialog you'll say

GetMapValue gmv = new GetMapValue();
then you may set some imporant parameters which would be neecassary for creation of your map:

gmv.setInitialVlaue(someString);
...

then you'll get your map:

HashMap <...> m = gmv.getMap();

and in this getMap() method of GetMapValue class you'll accumulate the map and return it to the calling method

then  you'l ismnstatntiate the TbaleInput class
and feed the HashMap to that class in its constructir:

TableInput ti = new TableInput(m);

then you'll within cobnstructor assign perovided instance of HashMap
to the instance avariable of hashmap inside the TableInput class - and
use that instance to retrieve all data from the m instance
and these data you'll use to pouplate TableModel instance of your JTable

This is the approximate scheme


0
 

Author Comment

by:jkteater
ID: 36531136
So do I understand it correctly that you main action is
happenuing in CallDialog - it first calls method
of the class GetMapVlaue to create the map and
then instatitates class TableInput which should use this map
to create the JTable - is this correct understanding ?

Here may be the best way to think about it.
GetMapValue is being called from a shortcut menu in the interface.  The sole purpose of this class and action is to store the values the user selects.  This class will be run and no other actions have to take place other than storing the selected values in a map.

Once the user selects their selections, then they can go up to the menu bar and select to run CallDialog class.  This is the class that runs the class tableinput and it will call other classes as well.
So you are correct about CallDialog being the main class, but it does not ever call GetMapValues.  GetMapValues runs only from the shortcut menu and only stores the values.

So I am trying to get map from GetMapValue Class to the TableInput Class
 
0
 

Author Comment

by:jkteater
ID: 36531148
Even though it is the same project - GetMapvalue and CallDialog are executed from two different places in the UI.  CallDialog is the main program.  
0
 

Author Comment

by:jkteater
ID: 36531194
Is it possible to get the map to TableInput Class, even though they do not call each other?

Ran from Shotcut Menu         Ran from Main Menu
GetMapValue (solo)               CallDialog (Main)
___________                      ___________
|                    |                       |                     |
|                    |                       |                     |
__________                         ___________
                                                       |
                                                       |    Call to TableInput
                                                      \/
         
                                                TableInput
                                            ____________
                                            |                      |
                                            |                      |
                                            ___________                  
0
 
LVL 47

Expert Comment

by:for_yan
ID: 36531196
OK, then the scheme I outlined above should be modified in the sense
taht you should start from some previous class the one from which you call GetMapValue (howvere this class is callsed - this is the one which handlles even of your menu and
then calls getMapValue())
So you cal getMapValue and get the value of hashmap first into that previous class, then when you instantiate
CallDialog - you can add this instance of hashmap (m) to the constructore of CallDialog and then CallDialog will pass it further to the constructor
ot Table Input. So if you create TableInput in the constructor of CallDialog you will not need tio have "m" variabel to be an instance variable of
CallDialog. If you instantiate TableInput in some other method of CallDialog
then you rathe make "m" the instance variable of CallDialog assign
it inthe constructor this.m = m;
and then in some othe mnethod where you instantiate TableInput, variable m (your HashMap)  will be accessible to you.
 
0
 

Author Comment

by:jkteater
ID: 36531208
GetMapValue (solo)               CallDialog (Main)
___________                      ___________
|                    |                       |                     |
|    map         |                       |                     |
______\___                         ___________
                 \                                   |
                    \                                |    Call to TableInput
                           \                         \/
                               \
                                    \            TableInput
                                             ____________
                                            | map              |
                                            |                      |
                                            ___________                  
0
 
LVL 47

Expert Comment

by:for_yan
ID: 36531216
Yes, it is poossible - read my two last posts - as I mentioned you can pass
the map throgh the class which communicates with both of them or in your case - you first get the
map into the class which insitiates GetMapValue thwen pass it on to ClassDaiklog, then ClassDialog passes it on to
the TableInput - there is no oroblem with allo of it - you do it in java normally all the time - this is just the reference to the map which is passed,
so it is very "lightweight" process

 
0
 

Author Comment

by:jkteater
ID: 36531289
Here is what I am trying in the main class

public class ediDialogHandler extends AbstractHandler {
   
   ediHandler gmv = new ediHandler();
   Map <TCComponent, TCComponent> m = gmv.getMap();  
   
   public ediDialogHandler() {  <==== This is the constructor - What goes in there?
      // TODO Auto-generated constructor stub
     
   }
       
0
 

Author Comment

by:jkteater
ID: 36531302
This is the method I created in the GetMapValue class

public Map<TCComponent, TCComponent> getMap() {
      
      return null;
}

Once again I am not sure what goes in here
0
 
LVL 47

Expert Comment

by:for_yan
ID: 36531359
You probably need to craete one more mnethod which would not vbe rerturning anything but which would be busy
creating this map, or you can put all this fiunctionality into getMap()  method - that can be done in eitehr way

As you parivbably already have this fuinctionalyty written so you
make HashMap variable instance variable of class getMapValue() - so you instantiate it in the constructir
and then you should call some method which would populate the data into m, and after it is paopyulated you will get it using getMap()

so from your originla class uit should vbe something like that:
ediHandler gmv = new ediHandler(); <-- here it create empty m
gmv.populate(); <-- here uit will populate m;
hashmap m = gmv.getMap(); <-- you get it back from gmv

in this case your getMap() method would be
simple


public Map<TCComponent, TCComponent> getMap() {
     
      return m;
}

but it should be called after all that code which queries the user and accumulates data into map instancwe gets a chance to execute



0

Featured Post

What Is Threat Intelligence?

Threat intelligence is often discussed, but rarely understood. Starting with a precise definition, along with clear business goals, is essential.

Join & Write a Comment

Suggested Solutions

Java contains several comparison operators (e.g., <, <=, >, >=, ==, !=) that allow you to compare primitive values. However, these operators cannot be used to compare the contents of objects. Interface Comparable is used to allow objects of a cl…
Introduction This article is the last of three articles that explain why and how the Experts Exchange QA Team does test automation for our web site. This article covers our test design approach and then goes through a simple test case example, how …
This tutorial covers a practical example of lazy loading technique and early loading technique in a Singleton Design Pattern.
This tutorial will introduce the viewer to VisualVM for the Java platform application. This video explains an example program and covers the Overview, Monitor, and Heap Dump tabs.

706 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now