/*=============================================================================#
# Copyright (c) 2009-2016 Stephan Wahlbrink (WalWare.de) 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:
# Stephan Wahlbrink - initial API and implementation
#=============================================================================*/
package de.walware.ecommons.ltk.core.impl;
import java.net.URI;
import org.eclipse.core.resources.IFile;
import org.eclipse.core.resources.IResource;
import org.eclipse.core.resources.ResourcesPlugin;
import org.eclipse.core.runtime.IPath;
import org.eclipse.core.runtime.Path;
import de.walware.ecommons.ltk.ISourceUnitFactory;
import de.walware.ecommons.ltk.LTK;
import de.walware.ecommons.ltk.core.model.ISourceUnit;
/**
* Abstract factory for {@link LTK#PERSISTENCE_CONTEXT}.
*/
public abstract class AbstractFilePersistenceSourceUnitFactory implements ISourceUnitFactory {
private static final String IFILE_PREFIX = "platform:/resource"; //$NON-NLS-1$
public static String createResourceId(final IResource file) {
if (file != null) {
final IPath path = file.getFullPath();
if (path != null) {
return IFILE_PREFIX + path.toPortableString(); // eclipse-platform-resource
}
}
return null;
}
public static String createResourceId(URI uri) {
if (uri != null) {
uri = uri.normalize();
if (uri.getScheme() == null) {
return "xxx:"+uri.toString(); //$NON-NLS-1$
}
else {
return uri.toString();
}
}
return null;
}
public AbstractFilePersistenceSourceUnitFactory() {
}
@Override
public String createId(final Object from) {
if (from instanceof IFile) {
return createResourceId((IFile) from);
}
if (from instanceof String) {
final String s = (String) from;
if (s.startsWith(IFILE_PREFIX)) {
return s;
}
}
return null;
}
@Override
public ISourceUnit createSourceUnit(final String id, final Object from) {
IFile ifile;
if (from instanceof IFile) {
ifile = (IFile) from;
}
else {
final IPath path = Path.fromPortableString(id.substring(IFILE_PREFIX.length()));
ifile = ResourcesPlugin.getWorkspace().getRoot().getFile(path);
}
return createSourceUnit(id, ifile);
}
protected abstract ISourceUnit createSourceUnit(final String id, final IFile file);
}