/******************************************************************************* * Copyright (c) 2007 Exadel, Inc. and Red Hat, Inc. * Distributed under license by Red Hat, Inc. All rights reserved. * This program is 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: * Exadel, Inc. and Red Hat, Inc. - initial API and implementation ******************************************************************************/ package org.jboss.tools.common.core.resources; import java.io.File; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; import org.eclipse.ui.*; import org.eclipse.ui.internal.part.NullEditorInput; import org.eclipse.ui.part.*; import org.jboss.tools.common.model.*; import org.jboss.tools.common.model.filesystems.impl.FileSystemImpl; import org.jboss.tools.common.model.project.IModelNature; import org.jboss.tools.common.model.util.*; import org.jboss.tools.common.model.ui.editor.ModelObjectEditorInput; import org.jboss.tools.common.model.ui.editor.ModelObjectJarEntryEditorInput; import org.jboss.tools.common.model.ui.editor.ModelObjectLocationEditorInput; import org.jboss.tools.common.model.ui.editor.ModelObjectStorageEditorInput; public class XModelObjectEditorInputFactory implements IElementFactory { private static final String ID_FACTORY = "org.jboss.tools.common.core.resources.XModelObjectEditorInputFactory"; //$NON-NLS-1$ private static final String TAG_PATH = "path"; //$NON-NLS-1$ private static final String TAG_PROJECT = "project"; //$NON-NLS-1$ private static final String TAG_FILE_LOCATION = "filepath"; //$NON-NLS-1$ private static final String TAG_ENTRY = "entry"; //$NON-NLS-1$ public IAdaptable createElement(IMemento memento) { String projectPath = memento.getString(TAG_PROJECT); if(projectPath != null) return createStorageElement(memento); String fileLocation = memento.getString(TAG_FILE_LOCATION); if(fileLocation != null) return createStorageElement(memento); String fileName = memento.getString(TAG_PATH); if (fileName == null) return null; IResource res = ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(fileName)); if (res instanceof IFile) { XModelObject o = EclipseResourceUtil.getObjectByResource(res); return (o != null) ? (IAdaptable)XModelObjectEditorInput.createInstance(o) : (IAdaptable)new FileEditorInput((IFile)res); } else { res = ResourcesPlugin.getWorkspace().getRoot().getFile(new Path(fileName)); return (IAdaptable)new FileEditorInput((IFile)res); } } private IAdaptable createStorageElement(IMemento memento) { String projectPath = memento.getString(TAG_PROJECT); XModelObject object = null; String missingName = ""; //$NON-NLS-1$ if(projectPath == null) { String fileLocation = memento.getString(TAG_FILE_LOCATION); if(fileLocation != null) { File f = new File(fileLocation); if(f.isFile()) { object = EclipseResourceUtil.createObjectForLocation(fileLocation); return (object == null) ? null : new ModelObjectLocationEditorInput(object, new Path(f.getAbsolutePath())); } else { missingName = f.getName(); } } } else if(memento.getString(TAG_ENTRY) != null) { IProject project = (IProject)ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(projectPath)); String fileLocation = memento.getString(TAG_FILE_LOCATION); String entry = memento.getString(TAG_ENTRY); return XModelObjectEditorInput.createJarEntryEditorInput(project, fileLocation, entry); } else { IProject project = (IProject)ResourcesPlugin.getWorkspace().getRoot().findMember(new Path(projectPath)); String objectPath = memento.getString(TAG_PATH); IModelNature nature = EclipseResourceUtil.getModelNature(project); if(nature == null) { missingName = "" + objectPath; //$NON-NLS-1$ } else { XModel model = nature.getModel(); object = model.getByPath(objectPath); } } if(object == null) { return createNullEditorInput(missingName); } return new ModelObjectStorageEditorInput(object); } public static String getFactoryId() { return ID_FACTORY; } public static void saveState(IMemento memento, IFileEditorInput input) { IFile file = input.getFile(); memento.putString(TAG_PATH, file.getFullPath().toString()); } public static void saveState(IMemento memento, ModelObjectEditorInput input) { if(input instanceof ModelObjectJarEntryEditorInput) { saveState(memento, (ModelObjectJarEntryEditorInput)input); return; } XModelObject o = input.getXModelObject(); IProject p = EclipseResourceUtil.getProject(o); if(p != null) { memento.putString(TAG_PROJECT, p.getFullPath().toString()); memento.putString(TAG_PATH, o.getPath()); } else { String location = getFileLocation(o); if(location != null) memento.putString(TAG_FILE_LOCATION, location); } } public static void saveState(IMemento memento, ModelObjectJarEntryEditorInput input) { XModelObject o = input.getXModelObject(); IProject p = EclipseResourceUtil.getProject(o); if(p != null) { memento.putString(TAG_PROJECT, p.getFullPath().toString()); memento.putString(TAG_FILE_LOCATION, input.getJarFile()); memento.putString(TAG_ENTRY, input.getJarEntry()); } else { String location = getFileLocation(o); if(location != null) memento.putString(TAG_FILE_LOCATION, location); } } public static String getFileLocation(XModelObject object) { if(object == null || object.getFileType() != XModelObject.FILE) return null; XModelObject fs = object.getParent(); while(fs != null && fs.getFileType() != XModelObject.SYSTEM) fs = fs.getParent(); if(fs instanceof FileSystemImpl) { FileSystemImpl fsi = (FileSystemImpl)fs; String location = fsi.getAbsoluteLocation() + XModelObjectLoaderUtil.getResourcePath(object); return location; } return null; } public static IEditorInput createNullEditorInput(final String entry) { return new NullEditorInput() { public String getName() { if(entry != null) { int i = entry.lastIndexOf('/'); if(i > 0) return entry.substring(i + 1); } return entry; } public String getToolTipText() { return entry; } }; } }