| /******************************************************************************* |
| * Copyright (c) 2009, 2010 IBM Corporation and others. |
| * 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: |
| * IBM Corporation - initial API and implementation |
| *******************************************************************************/ |
| package org.eclipse.ptp.internal.rdt.core.miners; |
| |
| import java.io.BufferedReader; |
| import java.io.File; |
| import java.io.FileInputStream; |
| import java.io.FileNotFoundException; |
| import java.io.IOException; |
| import java.io.InputStreamReader; |
| import java.io.UnsupportedEncodingException; |
| import java.lang.reflect.Constructor; |
| import java.lang.reflect.InvocationTargetException; |
| import java.net.URI; |
| import java.net.URISyntaxException; |
| import java.util.HashMap; |
| import java.util.Map; |
| |
| import org.eclipse.dstore.core.model.DE; |
| import org.eclipse.dstore.core.model.DataStore; |
| import org.eclipse.dstore.core.model.DataStoreAttributes; |
| import org.eclipse.ptp.rdt.core.miners.IURICreator; |
| |
| /** |
| * @author crecoskie |
| * |
| */ |
| public class URICreatorManager { |
| private static URICreatorManager fInstance; |
| |
| private Map<String, IURICreator> fCreatorsMap; |
| private DataStore fDataStore; |
| |
| |
| private URICreatorManager(DataStore datastore) { |
| fCreatorsMap = new HashMap<String, IURICreator>(); |
| fDataStore = datastore; |
| loadExtensions(); |
| } |
| |
| private void loadExtensions() { |
| // load all extensions from URICreator.dat, which consists of a series of one-line |
| // entries that contain comma separated mappings between URI schemes and Java classes |
| // e.g. |
| // examplescheme,org.eclipse.example.someclass |
| String pluginDir = fDataStore.getAttribute(DataStoreAttributes.A_PLUGIN_PATH); |
| |
| // default location |
| String dataFile = pluginDir + File.separator + "URICreator.dat"; //$NON-NLS-1$ |
| |
| // try loading in UTF-8 |
| if(loadCreators(DE.ENCODING_UTF_8, dataFile) == false) { |
| // didn't work... try loading with native encoding |
| loadCreators(null, dataFile); |
| } |
| } |
| |
| private boolean loadCreators(String encoding, String filename) { |
| FileInputStream datafile; |
| try { |
| datafile = new FileInputStream(filename); |
| } catch (FileNotFoundException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| return false; |
| } |
| |
| BufferedReader reader = null; |
| if (encoding == null) |
| { |
| reader = new BufferedReader(new InputStreamReader(datafile)); |
| } |
| else |
| { |
| try { |
| reader = new BufferedReader(new InputStreamReader(datafile, encoding)); |
| } catch (UnsupportedEncodingException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| return false; |
| } |
| } |
| |
| String line; |
| try { |
| line = reader.readLine(); |
| } catch (IOException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| return false; |
| } |
| |
| String scheme = null; |
| while (line != null) |
| { |
| // check name |
| line = line.trim(); |
| |
| // allow comments |
| if (!line.startsWith("#")) //$NON-NLS-1$ |
| { |
| |
| String[] tokens = line.split(","); //$NON-NLS-1$ |
| if(tokens.length < 2) |
| return false; |
| |
| scheme = tokens[0]; |
| IURICreator creator = loadCreator(tokens[1]); |
| if (creator != null) |
| { |
| fCreatorsMap.put(scheme, creator); |
| } |
| } |
| |
| try { |
| line = reader.readLine(); |
| } catch (IOException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| return false; |
| } |
| } |
| return true; |
| } |
| |
| @SuppressWarnings("unchecked") |
| private IURICreator loadCreator(String string) { |
| Class theClass; |
| try { |
| theClass = Class.forName(string); |
| } catch (ClassNotFoundException e) { |
| // TODO proper logging |
| e.printStackTrace(); |
| return null; |
| } |
| // call the zero argument constructor |
| try { |
| Constructor constructor = theClass.getConstructor(new Class[0]); |
| try { |
| IURICreator creator = (IURICreator) constructor.newInstance(); |
| |
| if(creator != null) { |
| return creator; |
| } |
| } catch (IllegalArgumentException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| return null; |
| } catch (InstantiationException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| return null; |
| } catch (IllegalAccessException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| return null; |
| } catch (InvocationTargetException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| return null; |
| } |
| } catch (SecurityException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| return null; |
| } catch (NoSuchMethodException e) { |
| // TODO Auto-generated catch block |
| e.printStackTrace(); |
| return null; |
| } |
| |
| return null; |
| } |
| |
| public static synchronized URICreatorManager getDefault(DataStore datastore) { |
| if(fInstance == null) { |
| fInstance = new URICreatorManager(datastore); |
| } |
| |
| return fInstance; |
| } |
| |
| public URI createURI(String scheme, String host, String path) throws URISyntaxException { |
| ScopeManager scopeManager = ScopeManager.getInstance(); |
| |
| String scopeName = scopeManager.getScopeForFile(path); |
| if(scopeName == null) { |
| return new URI("rse", host, path, null); //$NON-NLS-1$ |
| } |
| |
| String mappedPath = scopeManager.getMappedPathForFile(path); |
| String fileHost = scopeManager.getHostForFile(path, host); |
| |
| IURICreator creator = fCreatorsMap.get(scheme); |
| |
| if(creator != null) { |
| return creator.createURIForScheme(scheme, fileHost, path, mappedPath); |
| } |
| |
| else { |
| return new URI(scheme, host, path, null); |
| } |
| |
| } |
| |
| } |