/*******************************************************************************
* 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.model.ui.editor;
import java.io.*;
import java.util.ArrayList;
import java.util.List;
import org.eclipse.core.resources.*;
import org.eclipse.core.runtime.*;
import org.eclipse.jdt.core.IJarEntryResource;
import org.eclipse.jdt.core.IJavaProject;
import org.eclipse.jdt.core.IPackageFragment;
import org.eclipse.jdt.core.IPackageFragmentRoot;
import org.eclipse.jdt.internal.core.JarEntryDirectory;
import org.eclipse.jdt.internal.core.JarEntryFile;
import org.eclipse.jdt.internal.core.JarEntryResource;
import org.eclipse.jdt.internal.core.NonJavaResource;
import org.jboss.tools.common.core.resources.XModelObjectEditorInput;
import org.jboss.tools.common.core.resources.XModelObjectEditorInputFactory;
import org.eclipse.ui.*;
import org.eclipse.ui.editors.text.ILocationProvider;
import org.jboss.tools.common.model.*;
import org.jboss.tools.common.model.filesystems.impl.*;
import org.jboss.tools.common.model.ui.ModelUIPlugin;
import org.jboss.tools.common.model.util.EclipseResourceUtil;
import org.jboss.tools.common.model.util.Paths;
import org.jboss.tools.common.util.FileUtil;
public class ModelObjectStorageEditorInput extends ModelObjectEditorInput implements IStorageEditorInput {
IJarEntryResource jarEntryFile = null;
public ModelObjectStorageEditorInput(XModelObject object) {
super(object);
jarEntryFile = findJarEntryFile();
}
public IStorage getStorage() throws CoreException {
return jarEntryFile != null ? jarEntryFile : storage;
}
@SuppressWarnings("rawtypes")
public Object getAdapter(Class adapter) {
if(adapter == IFile.class) return null;
return super.getAdapter(adapter);
}
IJarEntryResource findJarEntryFile() {
XModelObject o = object;
JarEntryFile f = null;
JarEntryResource current = null;
String packageName = "";
List<String> parts = new ArrayList<String>();
List<XModelObject> os = new ArrayList<XModelObject>();
while(o != null && o.getFileType() != XModelObject.SYSTEM) {
String part = o.getFileType() == XModelObject.FILE ? FileAnyImpl.toFileName(o) :
o.getFileType() == XModelObject.FOLDER ? o.getAttributeValue(XModelObjectConstants.ATTR_NAME) : null;
if(part != null) {
parts.add(0, part);
os.add(0, o);
if(f == null) {
f = new JarEntryFile(part) {
public InputStream getContents() throws CoreException {
return storage.getContents();
}
};
current = f;
} else {
if(packageName.length() > 0) {
packageName = part + "." + packageName;
} else {
packageName = part;
}
JarEntryDirectory d = new JarEntryDirectory(part);
current.setParent(d);
current = d;
}
}
o = o.getParent();
}
// if(!(o instanceof JarSystemImpl)) return null;
String file = Paths.expand(o.get(XModelObjectConstants.ATTR_NAME_LOCATION), o.getModel().getProperties());
IProject p = EclipseResourceUtil.getProject(o);
IJavaProject jp = EclipseResourceUtil.getJavaProject(p);
if(jp == null) return null;
IPackageFragmentRoot root = null;
try {
IPackageFragmentRoot[] rs = jp.getAllPackageFragmentRoots();
for (IPackageFragmentRoot r: rs) {
if(r.getResource() != null && r.getResource().exists()
&& r.getResource().getLocation().toString().equals(file)) {
root = r;
} else if(r.getPath() != null && r.getPath().toString().equals(file)) {
root = r;
}
}
} catch (CoreException e) {
ModelUIPlugin.getDefault().logError(e);
}
if(root == null) {
root = jp.getPackageFragmentRoot(file);
}
if(root == null) {
return null;
}
if(current != null && !"META-INF".equalsIgnoreCase(current.getName()) && packageName.length() > 0) {
IPackageFragment pf = root.getPackageFragment(packageName);
f.setParent(pf);
} else {
current.setParent(root);
if(!(o instanceof JarSystemImpl)) {
Object q = root;
NonJavaResource nj = null;
for (int i = 0; i < parts.size(); i++) {
IResource ri = (IResource)os.get(i).getAdapter(IResource.class);
if(ri == null) {
return f;
}
nj = new NonJavaResource(q, ri);
q = nj;
}
if(nj != null) {
return nj;
}
}
}
return f;
}
IStorage storage = new Storage();
class Storage implements IStorage {
public InputStream getContents() throws CoreException {
ByteArrayInputStream b = null;
if(object instanceof FileAnyImpl) {
FileAnyImpl f = (FileAnyImpl)object;
String s = f.getAsText();
String encoding = FileUtil.getEncoding(s);
byte[] bs = null;
if(encoding == null) {
bs = s.getBytes();
} else {
try {
bs = s.getBytes(encoding);
} catch (UnsupportedEncodingException e) {
bs = s.getBytes();
}
}
b = new ByteArrayInputStream(bs);
} else {
b = new ByteArrayInputStream(new byte[0]);
}
return b;
}
public IPath getFullPath() {
IProject p = EclipseResourceUtil.getProject(object);
if(p == null) {
String location = XModelObjectEditorInputFactory.getFileLocation(object);
if(location != null) {
return new Path(location);
}
} else {
XModelObject f = object;
while(f != null && f.getFileType() != XModelObject.SYSTEM) f = f.getParent();
if(f != null) {
IResource jar = EclipseResourceUtil.getResource(f);
if(jar != null) return jar.getFullPath();
}
}
String n = p == null ? "" : p.getName(); //$NON-NLS-1$
return new Path(n + "/" + object.getPath()); //$NON-NLS-1$
}
public String getName() {
return ModelObjectStorageEditorInput.this.getName();
}
public boolean isReadOnly() {
return !isEditable();
}
public Object getAdapter(Class adapter) {
if(adapter == ILocationProvider.class) {
if(ModelObjectStorageEditorInput.this instanceof ILocationProvider) {
return (ILocationProvider)ModelObjectStorageEditorInput.this;
}
}
return ModelObjectStorageEditorInput.this.getAdapter(adapter);
}
}
protected boolean isEditable() {
return false;
}
public boolean equals(Object o) {
if(super.equals(o)) return true;
if(o instanceof IStorageEditorInput) {
try {
IStorage st = ((IStorageEditorInput)o).getStorage();
if(jarEntryFile != null && jarEntryFile.equals(st)) return true;
} catch (CoreException e) {
//ignore
}
String[] entryInfo = XModelObjectEditorInput.parseJarEntryFileInput((IStorageEditorInput)o);
if(entryInfo == null) return false;
XModelObject mo = XModelObjectEditorInput.getJarEntryObject(null, entryInfo[0], entryInfo[1]);
return mo != null && mo.equals(object);
}
return false;
}
}