/******************************************************************************* * Copyright (c) 2006 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.team.examples.model; import java.io.*; import java.util.ArrayList; import java.util.List; import org.eclipse.core.resources.*; import org.eclipse.core.runtime.*; import org.eclipse.osgi.util.NLS; import org.eclipse.team.examples.filesystem.FileSystemPlugin; public class ModelObjectDefinitionFile extends ModelFile { public static final String MODEL_OBJECT_DEFINITION_FILE_EXTENSION = "mod"; public static boolean isModFile(IResource resource) { if (resource instanceof IFile) { String fileExtension = resource.getFileExtension(); if (fileExtension != null) return fileExtension.equals(MODEL_OBJECT_DEFINITION_FILE_EXTENSION); } return false; } public static IResource[] getReferencedResources(String projectName, IStorage storage) throws CoreException { if (storage == null) return new IResource[0]; List result = new ArrayList(); String[] filePaths = readLines(storage); for (int i = 0; i < filePaths.length; i++) { String path = filePaths[i]; IFile file = getFile(projectName, path); if (file != null && file.getFileExtension() != null && file.getFileExtension().equals(ModelObjectElementFile.MODEL_OBJECT_ELEMENTFILE_EXTENSION)) { result.add(file); } } return (IResource[]) result.toArray(new IResource[result.size()]); } public ModelObjectDefinitionFile(IFile file) { super(file); } /* (non-Javadoc) * @see org.eclipse.team.examples.model.ModelObject#getChildren() */ public ModelObject[] getChildren() throws CoreException { return getModelObjectElementFiles(); } public ModelObjectElementFile[] getModelObjectElementFiles() throws CoreException { List result = new ArrayList(); String[] filePaths = readLines((IFile)getResource()); for (int i = 0; i < filePaths.length; i++) { String path = filePaths[i]; IFile file = getFile(getResource().getProject().getName(), path); if (file != null) { ModelObjectElementFile moeFile = getMoeFile(file); if (moeFile != null) result.add(moeFile); } } return (ModelObjectElementFile[]) result.toArray(new ModelObjectElementFile[result.size()]); } private static String[] readLines(IStorage file) throws CoreException { BufferedReader reader = new BufferedReader(new InputStreamReader(file.getContents())); String line = null; List result = new ArrayList(); try { while ((line = reader.readLine()) != null) { result.add(line.trim()); } } catch (IOException e) { throw new CoreException(new Status(IStatus.ERROR, FileSystemPlugin.ID, 0, NLS.bind("Error reading from file {0}", file.getFullPath()), e)); } finally { try { reader.close(); } catch (IOException e) { // Ignore } } return (String[]) result.toArray(new String[result.size()]); } private void writeLines(String[] strings) throws CoreException { StringBuffer buffer = new StringBuffer(); for (int i = 0; i < strings.length; i++) { String string = strings[i]; buffer.append(string); buffer.append("\n"); } ((IFile)getResource()).setContents(new ByteArrayInputStream(buffer.toString().getBytes()), false, true, null); } private ModelObjectElementFile getMoeFile(IFile file) { if (ModelObjectElementFile.isMoeFile(file)) { return new ModelObjectElementFile(this, file); } return null; } private static IFile getFile(String projectName, String path) { if (path.length() == 0) return null; IWorkspace workspace = ResourcesPlugin.getWorkspace(); IStatus status = workspace.validatePath("/" + projectName + "/" + path, IResource.FILE); if (status.isOK()) { IProject project = workspace.getRoot().getProject(projectName); return project.getFile(new Path(path)); } FileSystemPlugin.log(status); return null; } public void addMoe(IFile file) throws CoreException { ((IFile)getResource()).appendContents(new ByteArrayInputStream(("\n" + file.getProjectRelativePath()).getBytes()), false, true, null); } public void remove(ModelObjectElementFile file) throws CoreException { ModelObjectElementFile[] files = getModelObjectElementFiles(); List paths = new ArrayList(); for (int i = 0; i < files.length; i++) { ModelObjectElementFile child = files[i]; if (!child.equals(file)) { paths.add(child.getResource().getProjectRelativePath().toString()); } } writeLines((String[]) paths.toArray(new String[paths.size()])); } public void delete() throws CoreException { ModelObjectElementFile[] files = getModelObjectElementFiles(); super.delete(); for (int i = 0; i < files.length; i++) { ModelObjectElementFile file = files[i]; file.getResource().delete(false, null); } } public void setElements(IResource[] resources) throws CoreException { List paths = new ArrayList(); for (int i = 0; i < resources.length; i++) { IResource resource = resources[i]; paths.add(resource.getProjectRelativePath().toString()); } writeLines((String[]) paths.toArray(new String[paths.size()])); } public boolean hasMoe(IFile file) throws CoreException { ModelObjectElementFile[] files = getModelObjectElementFiles(); for (int i = 0; i < files.length; i++) { ModelObjectElementFile child = files[i]; if (child.getResource().equals(file)) return true; } return false; } }