]> git.uio.no Git - ifi-stolz-refaktor.git/blobdiff - case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/JarEntryEditorInputFactory.java
Case Study: adding data and statistics
[ifi-stolz-refaktor.git] / case-study / jdt-before / ui / org / eclipse / jdt / internal / ui / JarEntryEditorInputFactory.java
diff --git a/case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/JarEntryEditorInputFactory.java b/case-study/jdt-before/ui/org/eclipse/jdt/internal/ui/JarEntryEditorInputFactory.java
new file mode 100644 (file)
index 0000000..bf38fed
--- /dev/null
@@ -0,0 +1,165 @@
+/*******************************************************************************
+ * Copyright (c) 2000, 2011 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.jdt.internal.ui;
+
+import java.util.ArrayList;
+
+import org.eclipse.core.runtime.IAdaptable;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.Path;
+
+import org.eclipse.ui.IElementFactory;
+import org.eclipse.ui.IMemento;
+
+import org.eclipse.jdt.core.IJarEntryResource;
+import org.eclipse.jdt.core.IJavaElement;
+import org.eclipse.jdt.core.IJavaProject;
+import org.eclipse.jdt.core.IPackageFragment;
+import org.eclipse.jdt.core.IPackageFragmentRoot;
+import org.eclipse.jdt.core.JavaCore;
+import org.eclipse.jdt.core.JavaModelException;
+
+import org.eclipse.jdt.internal.ui.javaeditor.JarEntryEditorInput;
+
+/**
+ * The JarEntryEditorInputFactory is used to save and recreate {@link JarEntryEditorInput}s.
+ *
+ * @see IMemento
+ * @see IElementFactory
+ */
+public class JarEntryEditorInputFactory implements IElementFactory {
+
+       public static final String FACTORY_ID= "org.eclipse.jdt.ui.internal.JarEntryEditorInputFactory"; //$NON-NLS-1$
+       private static final String KEY_ELEMENT= "element"; //$NON-NLS-1$
+       private static final String KEY_PATH= "path"; //$NON-NLS-1$
+
+       /**
+        * Public constructor for extension point.
+        */
+       public JarEntryEditorInputFactory() {
+       }
+
+       /*
+        * @see org.eclipse.ui.IElementFactory#createElement(org.eclipse.ui.IMemento)
+        */
+       public IAdaptable createElement(IMemento memento) {
+
+               String rootIdentifier= memento.getString(KEY_ELEMENT);
+               String pathIdentifier= memento.getString(KEY_PATH);
+               if (rootIdentifier != null && pathIdentifier != null) {
+                       IJavaElement restoredParent= JavaCore.create(rootIdentifier);
+                       try {
+                               Object[] children;
+                               if (restoredParent instanceof IPackageFragmentRoot) {
+                                       IPackageFragmentRoot restoredRoot= (IPackageFragmentRoot) restoredParent;
+                                       if (!restoredParent.exists()) {
+                                               restoredRoot= fuzzyResolveRoot(restoredRoot);
+                                               if (restoredRoot == null) {
+                                                       return null;
+                                               }
+                                       }
+                                       children= restoredRoot.getNonJavaResources();
+
+                               } else if (restoredParent instanceof IPackageFragment) {
+                                       IPackageFragment restoredPackage= (IPackageFragment) restoredParent;
+                                       if (!restoredPackage.exists()) {
+                                               IPackageFragmentRoot restoredRoot= (IPackageFragmentRoot) restoredPackage.getParent();
+                                               restoredRoot= fuzzyResolveRoot(restoredRoot);
+                                               if (restoredRoot == null) {
+                                                       return null;
+                                               }
+                                               restoredPackage= restoredRoot.getPackageFragment(restoredPackage.getElementName());
+                                               if (!restoredPackage.exists()) {
+                                                       return null;
+                                               }
+                                       }
+                                       children= restoredPackage.getNonJavaResources();
+                               } else {
+                                       return null; // should not happen
+                               }
+
+                               String[] pathSegments= new Path(pathIdentifier).segments();
+                               return createEditorInput(pathSegments, children);
+                       } catch (JavaModelException e) {
+                               return null;
+                       }
+               }
+               return null;
+       }
+
+       private IPackageFragmentRoot fuzzyResolveRoot(IPackageFragmentRoot restoredRoot) throws JavaModelException {
+               IJavaProject project= restoredRoot.getJavaProject();
+               String rootName= restoredRoot.getElementName();
+               int versionSepIndex= rootName.indexOf('_');
+               if (versionSepIndex > 0) {
+                       // try stripping plug-in version number
+                       String prefix= rootName.substring(0, versionSepIndex);
+                       IPackageFragmentRoot[] roots= project.getPackageFragmentRoots();
+                       for (int i= 0; i < roots.length; i++) {
+                               if (roots[i].getElementName().startsWith(prefix)) {
+                                       return roots[i];
+                               }
+                       }
+               }
+               return null;
+       }
+
+       private JarEntryEditorInput createEditorInput(String[] pathSegments, Object[] children) {
+               int depth= pathSegments.length;
+               segments: for (int i= 0; i < depth; i++) {
+                       String name= pathSegments[i];
+                       for (int j= 0; j < children.length; j++) {
+                               Object child= children[j];
+                               if (child instanceof IJarEntryResource) {
+                                       IJarEntryResource jarEntryResource= (IJarEntryResource) child;
+                                       if (name.equals(jarEntryResource.getName())) {
+                                               boolean isFile= jarEntryResource.isFile();
+                                               if (isFile) {
+                                                       if (i == depth - 1) {
+                                                               return new JarEntryEditorInput(jarEntryResource);
+                                                       } else {
+                                                               return null; // got a file for a directory name
+                                                       }
+                                               } else {
+                                                       children= jarEntryResource.getChildren();
+                                                       continue segments;
+                                               }
+                                       }
+                               }
+                       }
+                       return null; // no child found on this level
+               }
+               return null;
+       }
+
+       /*
+        * @see IPersistableElement#saveState(IMemento)
+        */
+       public static void saveState(IMemento memento, IJarEntryResource jarEntryResource) {
+               ArrayList<String> reversePath= new ArrayList<String>();
+               reversePath.add(jarEntryResource.getName());
+
+               Object parent= jarEntryResource.getParent();
+               while (parent instanceof IJarEntryResource) {
+                       jarEntryResource= (IJarEntryResource) parent;
+                       reversePath.add(jarEntryResource.getName());
+                       parent= jarEntryResource.getParent();
+               }
+               if (parent instanceof IPackageFragmentRoot || parent instanceof IPackageFragment) {
+                       memento.putString(KEY_ELEMENT, ((IJavaElement) parent).getHandleIdentifier());
+                       IPath path= new Path(reversePath.get(reversePath.size() - 1));
+                       for (int i= reversePath.size() - 2; i >= 0; i--) {
+                               path= path.append(reversePath.get(i));
+                       }
+                       memento.putString(KEY_PATH, path.toString());
+               }
+       }
+}