/**********************************************************************
* Copyright (c) 2005-2008 ant4eclipse project team.
*
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* Nils Hartmann, Daniel Kasmeroglu, Gerd Wuetherich
**********************************************************************/
package org.ant4eclipse.lib.platform.model.team.projectset.internal;
import org.ant4eclipse.lib.core.Assure;
import org.ant4eclipse.lib.core.Lifecycle;
import org.ant4eclipse.lib.core.configuration.Ant4EclipseConfiguration;
import org.ant4eclipse.lib.core.exception.Ant4EclipseException;
import org.ant4eclipse.lib.core.logging.A4ELogging;
import org.ant4eclipse.lib.core.service.ServiceRegistryAccess;
import org.ant4eclipse.lib.core.util.Pair;
import org.ant4eclipse.lib.core.util.Utilities;
import org.ant4eclipse.lib.core.xquery.XQuery;
import org.ant4eclipse.lib.core.xquery.XQueryHandler;
import org.ant4eclipse.lib.platform.PlatformExceptionCode;
import org.ant4eclipse.lib.platform.model.team.projectset.TeamProjectSet;
import org.ant4eclipse.lib.platform.model.team.projectset.TeamProjectSetFactory;
import org.ant4eclipse.lib.platform.model.team.projectset.TeamProjectSetFileParser;
import java.io.File;
import java.util.Hashtable;
import java.util.Map;
/**
* Reads an eclipse team project set file and constructs a
* {@link org.ant4eclipse.model.platform.team.projectset.TeamProjectSet TeamProjectSet} for it.
*
* <p>
* For the format of the psf-file used by Eclipse see org.eclipse.team.internal.ccvs.ui.CVSProjectSetSerializer
*
* @see #parseTeamProjectSet(File)
* @author Gerd Wütherich (gerd@gerd-wuetherich.de)
*/
public class TeamProjectSetFileParserImpl implements TeamProjectSetFileParser, Lifecycle {
/**
* The prefix for properties describing a team provider.
*
* <p>
* The property must have the (eclipse) provider id as key (after the suffix) and the implementation class name as
* value
*/
public static final String TEAMPROVIDER_PREFIX = "teamprovider";
/**
* A Map containing all registered {@link TeamProjectSetFactory} instances
*/
private Map<String, TeamProjectSetFactory> _factories;
/**
* {@inheritDoc}
*/
public void initialize() {
Ant4EclipseConfiguration config = ServiceRegistryAccess.instance().getService(Ant4EclipseConfiguration.class);
Iterable<Pair<String, String>> teamProviders = config.getAllProperties(TEAMPROVIDER_PREFIX);
Map<String, TeamProjectSetFactory> providers = new Hashtable<String, TeamProjectSetFactory>();
for (Pair<String, String> teamProvider : teamProviders) {
TeamProjectSetFactory factory = Utilities.newInstance(teamProvider.getSecond());
A4ELogging.trace("Adding TeamProjectSetFactory '%s' for provider '%s'", factory, teamProvider.getFirst());
providers.put(teamProvider.getFirst(), factory);
}
this._factories = providers;
}
/**
* {@inheritDoc}
*/
public void dispose() {
this._factories = null;
}
/**
* {@inheritDoc}
*/
public boolean isInitialized() {
return this._factories != null;
}
/**
* {@inheritDoc}
*/
public TeamProjectSet parseTeamProjectSetFile(File projectSetFile) {
Assure.isFile("projectSetFile", projectSetFile);
XQueryHandler queryhandler2 = new XQueryHandler();
// queries for the 'provider-id' attribute
XQuery providerIdQuery = queryhandler2.createQuery("/psf/provider/@id");
// query for the 'reference' elements
XQuery referenceQuery = queryhandler2.createQuery("/psf/provider/project/@reference");
// parse the file
XQueryHandler.queryFile(projectSetFile, queryhandler2);
// determine team project set-provider
String providerId = providerIdQuery.getSingleResult();
// get the factory for this provider
TeamProjectSetFactory projectSetFactory = getFactoryForProvider(providerId);
TeamProjectSet projectSet = projectSetFactory.createTeamProjectSet(projectSetFile.getName());
// retrieve the result
String[] projects = referenceQuery.getResult();
// create TeamProjectDescriptions for each project
for (String project : projects) {
projectSetFactory.addTeamProjectDescription(projectSet, project);
}
return projectSet;
}
public TeamProjectSetFactory getFactoryForProvider(String providerId) {
Assure.notNull("providerId", providerId);
if (!this._factories.containsKey(providerId)) {
throw new Ant4EclipseException(PlatformExceptionCode.UNKNOWN_TEAM_PROJECT_SET_PROVIDER, providerId);
}
return this._factories.get(providerId);
}
}