package samples.subsystems; import com.ibm.etools.systems.dftsubsystem.impl.DefaultSubSystemImpl; import samples.model.*; import com.ibm.etools.systems.subsystems.impl.*; import com.ibm.etools.systems.subsystems.*; import org.eclipse.core.runtime.*; // for IProgressMonitor import com.ibm.etools.systems.core.clientserver.NamePatternMatcher; import java.util.*; /** * This is our subsystem, which manages the remote connection and resources for * a particular system connection object. */ public class DeveloperSubSystem extends DefaultSubSystemImpl { private TeamResource[] teams; // faked-out master list of teams private Vector devVector = new Vector(); // faked-out master list of developers private static int employeeId = 123456; // employee Id factory /** * Constructor for DeveloperSubSystem. */ public DeveloperSubSystem() { super(); } /** * Return a singleton instance of an AbstractSystemManager subclass that manages * a pool of ISystem objects, one per system connection. By default, getSystem() * calls this, unless you override getSystem(). * * @return DeveloperSystemManager.getTheDeveloperSystemManager() */ public AbstractSystemManager getSystemManager() { return DeveloperSystemManager.getTheDeveloperSystemManager(); } /** * For drag and drop, and clipboard support of remote objects. * * Return the remote object within the subsystem that corresponds to * the specified unique ID. Because each subsystem maintains it's own * objects, it's the responsability of the subsystem to determine * how an ID (or key) for a given object maps to the real object. * By default this returns null. */ public Object getObjectWithAbsoluteName(String key) { // Functional opposite of getAbsoluteName(Object) in our resource adapters if (key.startsWith("Team_")) { String teamName = key.substring(5); TeamResource[] allTeams = getAllTeams(); for (int idx=0; idx<allTeams.length; idx++) if (allTeams[idx].getName().equals(teamName)) return allTeams[idx]; } else if (key.startsWith("Devr_")) { String devrId = key.substring(5); DeveloperResource[] devrs = getAllDevelopers(); for (int idx=0; idx<devrs.length; idx++) if (devrs[idx].getId().equals(devrId)) return devrs[idx]; } return null; } /** * When a filter is expanded, this is called for each filter string in the filter. * Using the criteria of the filter string, it must return objects representing remote resources. * For us, this will be an array of TeamResource objects. * * @param monitor - the progress monitor in effect while this operation performs * @param filterString - one of the filter strings from the expanded filter. */ protected Object[] internalResolveFilterString(IProgressMonitor monitor, String filterString) throws java.lang.reflect.InvocationTargetException, java.lang.InterruptedException { // Fake it out for now and return dummy list. // In reality, this would communicate with remote server-side code/data. TeamResource[] allTeams = getAllTeams(); // Now, subset master list, based on filter string... NamePatternMatcher subsetter = new NamePatternMatcher(filterString); Vector v = new Vector(); for (int idx=0; idx<allTeams.length; idx++) { if (subsetter.matches(allTeams[idx].getName())) v.addElement(allTeams[idx]); } TeamResource[] teams = new TeamResource[v.size()]; for (int idx=0; idx<v.size(); idx++) teams[idx] = (TeamResource)v.elementAt(idx); return teams; } /** * When a remote resource is expanded, this is called to return the children of the resource, if * the resource's adapter states the resource object is expandable. <br> * For us, it is a Team resource that was expanded, and an array of Developer resources will be returned. * * @param monitor - the progress monitor in effect while this operation performs * @param parent - the parent resource object being expanded * @param filterString - typically defaults to "*". In future additional user-specific quick-filters may be supported. */ protected Object[] internalResolveFilterString(IProgressMonitor monitor, Object parent, String filterString) throws java.lang.reflect.InvocationTargetException, java.lang.InterruptedException { // typically we ignore the filter string as it is always "*" // until support is added for "quick filters" the user can specify/select // at the time they expand a remote resource. TeamResource team = (TeamResource)parent; return team.getDevelopers(); } // ------------------ // Our own methods... // ------------------ /** * Get the list of all teams. Normally this would involve a trip the server, but we * fake it out and return a hard-coded local list. */ public TeamResource[] getAllTeams() { if (teams == null) teams = createTeams("Team ", 4); return teams; } /** * Get the list of all developers. Normally this would involve a trip the server, but we * fake it out and return a hard-coded local list. */ public DeveloperResource[] getAllDevelopers() { DeveloperResource[] allDevrs = new DeveloperResource[devVector.size()]; for (int idx=0; idx<allDevrs.length; idx++) allDevrs[idx] = (DeveloperResource)devVector.elementAt(idx); return allDevrs; } /* * Create and return a dummy set of teams */ private TeamResource[] createTeams(String prefix, int howMany) { TeamResource[] teams = new TeamResource[howMany]; for (int idx=0; idx<teams.length; idx++) { teams[idx] = new TeamResource(this); teams[idx].setName(prefix + (idx+1)); teams[idx].setDevelopers(createDevelopers(teams[idx].getName()+" developer",idx+1)); } return teams; } /* * Create and return a dummy set of developers */ private DeveloperResource[] createDevelopers(String prefix, int nbr) { DeveloperResource[] devrs = new DeveloperResource[nbr]; for (int idx=0; idx<devrs.length; idx++) { devrs[idx] = new DeveloperResource(this); devrs[idx].setName(prefix + (idx+1)); devrs[idx].setId(Integer.toString(employeeId++)); devrs[idx].setDeptNbr(Integer.toString((idx+1)*100)); devVector.add(devrs[idx]); // update master list } return devrs; } }