[jboss-cvs] jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/util ...
Robert Stryker
rob.stryker at jboss.com
Mon Apr 16 13:50:45 EDT 2007
User: rawb
Date: 07/04/16 13:50:45
Added: core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/util
ModelUtil.java PackagesExport.java TrueZipUtil.java
ModelTruezipBridge.java
Log:
Complete rewrite of the the two plugins leading to a cleaner, leaner project.
Revision Changes Path
1.3 +0 -0 jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/util/ModelUtil.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: ModelUtil.java
===================================================================
RCS file: ModelUtil.java
diff -N ModelUtil.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ModelUtil.java 16 Apr 2007 17:50:45 -0000 1.3
@@ -0,0 +1,60 @@
+package org.jboss.ide.eclipse.packages.core.util;
+
+import java.util.ArrayList;
+import java.util.Arrays;
+
+import org.eclipse.core.runtime.IPath;
+import org.jboss.ide.eclipse.packages.core.model.IPackageFileSet;
+import org.jboss.ide.eclipse.packages.core.model.IPackageNode;
+import org.jboss.ide.eclipse.packages.core.model.IPackageNodeVisitor;
+import org.jboss.ide.eclipse.packages.core.model.internal.PackagesModel;
+
+public class ModelUtil {
+ public static IPackageFileSet[] getMatchingFilesets(final IPath path) {
+ final ArrayList rets = new ArrayList();
+ PackagesModel.instance().accept(new IPackageNodeVisitor() {
+ public boolean visit(IPackageNode node) {
+ if( node.getNodeType() == IPackageNode.TYPE_PACKAGE_FILESET &&
+ ((IPackageFileSet)node).matchesPath(path)) {
+ rets.add((IPackageFileSet)node);
+ }
+ return true;
+ }
+ });
+ return (IPackageFileSet[]) rets.toArray(new IPackageFileSet[rets.size()]);
+ }
+
+ public static IPackageFileSet[] findAllDescendentFilesets(IPackageNode node) {
+ if( node.getNodeType() == IPackageNode.TYPE_PACKAGE_FILESET )
+ return new IPackageFileSet[] {(IPackageFileSet)node};
+
+ final ArrayList filesets = new ArrayList();
+ node.accept(new IPackageNodeVisitor() {
+ public boolean visit(IPackageNode node) {
+ if( node.getNodeType() == IPackageNode.TYPE_PACKAGE_FILESET)
+ filesets.add(node);
+ return true;
+ }
+ });
+ return (IPackageFileSet[]) filesets.toArray(new IPackageFileSet[filesets.size()]);
+ }
+
+
+ public static boolean otherFilesetMatchesPath(IPackageFileSet fileset, IPath path) {
+ IPackageFileSet[] filesets = ModelUtil.getMatchingFilesets(path);
+ if( filesets.length == 0 || (filesets.length == 1 && Arrays.asList(filesets).contains(fileset))) {
+ return false;
+ } else {
+ // other filesets DO match... but are they at the same location in the archive?
+ for( int i = 0; i < filesets.length; i++ ) {
+ if( fileset.equals(filesets[i])) continue;
+ if( fileset.getRootPackageRelativePath(path).equals(filesets[i].getRootPackageRelativePath(path))) {
+ // the two put the file in the same spot! It's a match!
+ return true;
+ }
+ }
+ }
+ return false;
+ }
+
+}
1.5 +0 -0 jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/util/PackagesExport.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: PackagesExport.java
===================================================================
RCS file: PackagesExport.java
diff -N PackagesExport.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ PackagesExport.java 16 Apr 2007 17:50:45 -0000 1.5
@@ -0,0 +1,184 @@
+package org.jboss.ide.eclipse.packages.core.util;
+
+import java.io.ByteArrayInputStream;
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.io.InputStream;
+import java.util.ArrayList;
+import java.util.Iterator;
+import java.util.List;
+import java.util.Map;
+
+import javax.xml.transform.Source;
+import javax.xml.transform.Transformer;
+import javax.xml.transform.TransformerConfigurationException;
+import javax.xml.transform.TransformerException;
+import javax.xml.transform.TransformerFactory;
+import javax.xml.transform.TransformerFactoryConfigurationError;
+import javax.xml.transform.stream.StreamResult;
+import javax.xml.transform.stream.StreamSource;
+
+import org.eclipse.core.resources.IFile;
+import org.eclipse.core.resources.IProject;
+import org.eclipse.core.runtime.CoreException;
+import org.eclipse.core.runtime.IPath;
+import org.eclipse.core.runtime.IProgressMonitor;
+import org.eclipse.core.runtime.Path;
+import org.eclipse.core.runtime.QualifiedName;
+import org.jboss.ide.eclipse.packages.core.PackagesCorePlugin;
+import org.jboss.ide.eclipse.packages.core.model.IPackage;
+import org.jboss.ide.eclipse.packages.core.model.IPackageFileSet;
+import org.jboss.ide.eclipse.packages.core.model.IPackageNode;
+import org.jboss.ide.eclipse.packages.core.model.IPackageNodeVisitor;
+import org.jboss.ide.eclipse.packages.core.model.internal.PackagesModel;
+import org.jboss.ide.eclipse.packages.core.model.internal.xb.XbPackages;
+
+public class PackagesExport {
+ public static final QualifiedName PROPERTY_ANT_SCRIPT_PATH =
+ new QualifiedName("org.jboss.ide.eclipse.packages.core", "antScriptPath");
+
+ public static final IPath DEFAULT_ANT_SCRIPT_PATH = new Path("buildPackages.xml");
+ public static final String XSL_PATH = "xml/packages2ant.xsl";
+
+ private static String escapeProjectName(IProject project)
+ {
+ String name = project.getName();
+ name = name.replaceAll(" ", "_");
+ return name;
+ }
+
+ public static List findReferencedProjects (IProject project, IPackage pkg)
+ {
+ final ArrayList referencedProjects = new ArrayList();
+ referencedProjects.add(project);
+
+ pkg.accept(new IPackageNodeVisitor () {
+ public boolean visit (IPackageNode node)
+ {
+ if (node.getNodeType() == IPackageNode.TYPE_PACKAGE_FILESET)
+ {
+ IPackageFileSet fileset = (IPackageFileSet)node;
+ IProject project = fileset.getProject();
+ if (!project.equals(project) && !referencedProjects.contains(project))
+ {
+ referencedProjects.add(project);
+ }
+ }
+ return true;
+ }
+ });
+ return referencedProjects;
+ }
+
+ public static void exportAntScript (IProject project, Map args, IProgressMonitor monitor)
+ {
+ monitor.beginTask("Exporting ant script...", 2);
+
+ XbPackages projectPackagesElement = PackagesModel.instance().getXbPackages(project);
+ IPackage packages[] = PackagesModel.instance().getProjectPackages(project);
+ ArrayList referencedProjects = new ArrayList();
+
+ monitor.beginTask("Finding referenced projects...", packages.length);
+ for (int i = 0; i < packages.length; i++)
+ {
+ referencedProjects.addAll(findReferencedProjects(project, packages[i]));
+ monitor.worked(1);
+ }
+ monitor.done();
+
+ for (Iterator iter = referencedProjects.iterator(); iter.hasNext(); )
+ {
+ IProject referencedProject = (IProject)iter.next();
+ String propertyName = null;
+
+ if (referencedProject.equals(project))
+ {
+ propertyName = "project-root";
+ }
+ else {
+ propertyName = "project-root-" + escapeProjectName(referencedProject);
+ }
+
+ IPath location = referencedProject.getLocation();
+ if (location != null)
+ projectPackagesElement.getProperties().getProperties().setProperty(propertyName, location.toString());
+ }
+
+ try {
+ InputStream configIn = project.getFile(PackagesModel.PROJECT_PACKAGES_FILE).getContents();
+ InputStream xslIn = PackagesCorePlugin.getDefault().getBundle().getEntry(XSL_PATH).openStream();
+ ByteArrayOutputStream out = new ByteArrayOutputStream();
+ IFile antFile = project.getFile(getPathToPackagesScript(project));
+
+ Source stylesheet = new StreamSource(xslIn);
+ Transformer transformer = TransformerFactory.newInstance().newTransformer(stylesheet);
+ transformer.setOutputProperty("indent", "yes");
+ transformer.setOutputProperty("{http://xml.apache.org/xslt}indent-amount", "2");
+ transformer.transform(new StreamSource(configIn), new StreamResult(out));
+
+ ByteArrayInputStream fileStream = new ByteArrayInputStream(out.toByteArray());
+ if (!antFile.exists()) {
+ antFile.create(fileStream, true, monitor);
+ }
+ else {
+ antFile.setContents(fileStream, IFile.KEEP_HISTORY, monitor);
+ }
+
+ xslIn.close();
+ out.close();
+
+ monitor.worked(1);
+ monitor.done();
+ } catch (TransformerConfigurationException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IllegalArgumentException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (CoreException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (TransformerFactoryConfigurationError e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (TransformerException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+ }
+
+ public static IPath getPathToPackagesScript (IProject project)
+ {
+ try {
+ String scriptPath = project.getPersistentProperty(PROPERTY_ANT_SCRIPT_PATH);
+ if (scriptPath == null) {
+ project.setPersistentProperty(PROPERTY_ANT_SCRIPT_PATH, DEFAULT_ANT_SCRIPT_PATH.toString());
+ return DEFAULT_ANT_SCRIPT_PATH;
+ }
+ else
+ return new Path(scriptPath);
+ } catch (CoreException e) {
+ e.printStackTrace();
+ }
+
+ return DEFAULT_ANT_SCRIPT_PATH;
+ }
+
+ public static IPath getRawPathToPackagesScript (IProject project)
+ {
+ IPath scriptPath = getPathToPackagesScript(project);
+ IFile script = project.getFile(scriptPath);
+ if (script != null)
+ {
+ if (script.getLocation() == null)
+ return script.getRawLocation();
+ return script.getLocation();
+ }
+
+ return scriptPath;
+ }
+
+}
1.3 +0 -0 jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/util/TrueZipUtil.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: TrueZipUtil.java
===================================================================
RCS file: TrueZipUtil.java
diff -N TrueZipUtil.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ TrueZipUtil.java 16 Apr 2007 17:50:45 -0000 1.3
@@ -0,0 +1,141 @@
+package org.jboss.ide.eclipse.packages.core.util;
+
+import java.io.FileNotFoundException;
+import java.io.IOException;
+
+import org.eclipse.core.runtime.IPath;
+
+import de.schlichtherle.io.ArchiveDetector;
+import de.schlichtherle.io.ArchiveException;
+
+public class TrueZipUtil {
+
+ public static de.schlichtherle.io.File getFile(IPath path) {
+ return getFile(path, ArchiveDetector.DEFAULT);
+ }
+ public static de.schlichtherle.io.File getFile(IPath path, ArchiveDetector detector) {
+ return new de.schlichtherle.io.File(path.toOSString(), detector);
+ }
+
+ public static boolean pathExists(IPath path) {
+ return pathExists( getFile(path));
+ }
+ public static boolean pathExists( de.schlichtherle.io.File file) {
+ return file.exists();
+ }
+
+
+ public static long getTimestamp(IPath path) {
+ return getTimestamp( getFile(path));
+ }
+
+ public static long getTimestamp(de.schlichtherle.io.File file) {
+ return file.lastModified();
+ }
+
+
+ public static void copyFile(String source, IPath dest) throws IOException {
+ copyFile(source, getFile(dest));
+ }
+
+ public static void copyFile(String source, de.schlichtherle.io.File file) {
+ try {
+ // make parent folders
+ if( !file.getParentFile().exists() )
+ file.getParentFile().mkdirs();
+
+ de.schlichtherle.io.FileOutputStream fos = new de.schlichtherle.io.FileOutputStream(file);
+ java.io.FileInputStream fis = new java.io.FileInputStream(source);
+
+ byte[] buf = new byte[1024];
+ int i = 0;
+ while((i=fis.read(buf))!=-1) {
+ fos.write(buf, 0, i);
+ }
+ fis.close();
+ fos.close();
+ } catch (FileNotFoundException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ } catch (IOException e) {
+ // TODO Auto-generated catch block
+ e.printStackTrace();
+ }
+
+ updateParentTimestamps(file);
+ }
+
+ public static void touchFile(IPath path) {
+ de.schlichtherle.io.File f = getFile(path);
+ f.setLastModified(System.currentTimeMillis());
+ updateParentTimestamps(path);
+ }
+
+
+ // Delete methods
+ public static void deleteAll(IPath path, String fileName) {
+ deleteAll(path.append(fileName));
+ }
+ public static void deleteAll(IPath path) {
+ deleteAll(getFile(path));
+ }
+ public static void deleteAll(de.schlichtherle.io.File file) {
+ file.deleteAll();
+ }
+
+ public static void deleteEmptyFolders(java.io.File file ) {
+ if( file.isDirectory() ) {
+ java.io.File[] children = file.listFiles();
+ for( int i = 0; i < children.length; i++ )
+ deleteEmptyFolders(children[i]);
+ if( file.listFiles().length == 0 )
+ file.delete();
+ }
+ }
+
+
+ public static void createFolder(IPath parent, String folderName) {
+ createFolder(parent.append(folderName));
+ }
+ public static void createFolder(IPath path) {
+ getFile(path, ArchiveDetector.NULL).mkdirs();
+ updateParentTimestamps(path);
+ }
+ public static void createArchive(IPath parent, String folderName) {
+ createArchive(parent.append(folderName));
+ }
+ public static void createArchive(IPath path) {
+ getFile(path).mkdirs();
+ updateParentTimestamps(path);
+ }
+ public static void umount() {
+ try {
+ de.schlichtherle.io.File.umount();
+ } catch( ArchiveException ae ) {
+ }
+ }
+
+ /**
+ * Sync's with file system after executing
+ * @param run
+ */
+ public static void syncExec(Runnable run) {
+ try {
+ run.run();
+ } catch (Exception e ) {}
+ umount();
+ }
+
+ public static void updateParentTimestamps(IPath path) {
+ updateParentTimestamps(getFile(path));
+ }
+ public static void updateParentTimestamps(de.schlichtherle.io.File file) {
+ long time = System.currentTimeMillis();
+ de.schlichtherle.io.File parent = file.getEnclArchive();
+ while( parent != null ) {
+ parent.setLastModified(time);
+ parent = parent.getEnclArchive();
+ }
+
+ }
+}
1.3 +0 -0 jbosside/core/plugins/org.jboss.ide.eclipse.packages.core/src/main/org/jboss/ide/eclipse/packages/core/util/ModelTruezipBridge.java
(In the diff below, changes in quantity of whitespace are not shown.)
Index: ModelTruezipBridge.java
===================================================================
RCS file: ModelTruezipBridge.java
diff -N ModelTruezipBridge.java
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ ModelTruezipBridge.java 16 Apr 2007 17:50:45 -0000 1.3
@@ -0,0 +1,178 @@
+package org.jboss.ide.eclipse.packages.core.util;
+
+import org.eclipse.core.runtime.IPath;
+import org.jboss.ide.eclipse.packages.core.model.IPackage;
+import org.jboss.ide.eclipse.packages.core.model.IPackageFileSet;
+import org.jboss.ide.eclipse.packages.core.model.IPackageFolder;
+import org.jboss.ide.eclipse.packages.core.model.IPackageNode;
+
+import de.schlichtherle.io.ArchiveDetector;
+import de.schlichtherle.io.File;
+
+/**
+ * This class is meant to bridge between the model
+ * and the raw true-zip utility class. It is a higher level
+ * API which deals with filesets and packages instead of
+ * raw Strings and paths.
+ *
+ * It will also make sure that a de.schlichtherle.io.File is
+ * created with the proper ArchiveDetector for each and every
+ * level, rather than the TrueZipUtil class, which not accurately
+ * create the proper File type for exploded archives.
+ *
+ * @author rstryker
+ *
+ */
+public class ModelTruezipBridge {
+ public static void deletePackage(IPackage pkg) {
+ final File file = getFile(pkg);
+ TrueZipUtil.syncExec(new Runnable() {
+ public void run() {
+ file.deleteAll();
+ }
+ });
+ }
+
+ public static void createContainer(IPackageNode node) {
+ File f = getFile(node);
+ f.mkdirs();
+ }
+
+ public static void deleteFolder(IPackageFolder folder) {
+ IPackageFileSet[] filesets = ModelUtil.findAllDescendentFilesets(folder);
+ deleteFolder(folder,filesets);
+ }
+
+ public static void deleteFolder(IPackageFolder folder, IPackageFileSet[] filesets) {
+ // remove all files from filesets
+ for( int i = 0; i < filesets.length; i++ )
+ fullFilesetRemove(filesets[i]);
+
+ final File file = getFile(folder);
+ TrueZipUtil.syncExec(new Runnable() {
+ public void run() {
+ TrueZipUtil.deleteEmptyFolders(file);
+ }
+ });
+ }
+
+ public static void fullFilesetBuild(IPackageFileSet fileset) {
+ fileset.resetScanner();
+ IPath[] paths = fileset.findMatchingPaths();
+ ModelTruezipBridge.copyFiles(fileset, paths);
+ }
+
+ public static void fullFilesetRemove(IPackageFileSet fileset) {
+ IPath[] paths = fileset.findMatchingPaths();
+ for( int i = 0; i < paths.length; i++ ) {
+ if( !ModelUtil.otherFilesetMatchesPath(fileset, paths[i])) {
+ // remove
+ ModelTruezipBridge.deleteFiles(fileset, new IPath[] {paths[i]});
+ }
+ }
+ }
+
+
+ public static void copyFiles(IPackageFileSet[] filesets, IPath[] paths) {
+ for( int i = 0; i < filesets.length; i++ ) {
+ copyFiles(filesets[i], paths);
+ }
+ }
+
+ public static void copyFiles(IPackageFileSet fileset, final IPath[] paths) {
+ final File[] destFiles = getFiles(paths, fileset);
+ TrueZipUtil.syncExec(new Runnable() {
+ public void run() {
+ for( int i = 0; i < paths.length; i++ ) {
+ TrueZipUtil.copyFile(paths[i].toOSString(), destFiles[i]);
+ }
+ }
+ });
+ }
+
+ public static void deleteFiles(IPackageFileSet[] filesets, IPath[] paths ) {
+ for( int i = 0; i < filesets.length; i++ ) {
+ deleteFiles(filesets[i], paths);
+ }
+ }
+ public static void deleteFiles(IPackageFileSet fileset, final IPath[] paths ) {
+ final File[] destFiles = getFiles(paths, fileset);
+ TrueZipUtil.syncExec(new Runnable() {
+ public void run() {
+ for( int i = 0; i < paths.length; i++ ) {
+ TrueZipUtil.deleteAll(destFiles[i]);
+ }
+ }
+ });
+ }
+
+ /**
+ * Gets all properly-created de.sch files for a fileset
+ * @param inputFiles
+ * @param fs
+ * @return
+ */
+ private static File[] getFiles(IPath[] inputFiles, IPackageFileSet fs ) {
+ String filesetRelative;
+ File fsFile = getFile(fs);
+ File[] returnFiles = new File[inputFiles.length];
+ int fsLength = fs.getSourcePath().toOSString().length()+1;
+ for( int i = 0; i < inputFiles.length; i++ ) {
+ filesetRelative = inputFiles[i].toOSString().substring(fsLength);
+ returnFiles[i] = new File(fsFile, filesetRelative, ArchiveDetector.NULL);
+ }
+ return returnFiles;
+ }
+
+
+ /**
+ * This should go through the tree and create a file that is
+ * correctly perceived at each step of the way.
+ *
+ * To just create a new File would let the Archive Detector have too
+ * much control, and *ALL* war's and jars, including exploded ones,
+ * would be treated as archives instead of folders.
+ * @param node
+ * @return
+ */
+ private static File getFile(IPackageNode node) {
+ if( node == null ) return null;
+
+ if( node.getNodeType() == IPackageNode.TYPE_MODEL ) return null;
+
+ if( node.getNodeType() == IPackageNode.TYPE_PACKAGE_FILESET)
+ return getFile(node.getParent());
+
+ File parentFile = getFile(node.getParent());
+ if( node.getNodeType() == IPackageNode.TYPE_PACKAGE ) {
+ IPackage node2 = ((IPackage)node);
+ boolean exploded = ((IPackage)node).isExploded();
+ ArchiveDetector detector = exploded ? ArchiveDetector.NULL : ArchiveDetector.DEFAULT;
+ if( parentFile == null )
+ return new File(node2.getDestinationPath().append(node2.getName()).toOSString(), detector);
+ return new File(parentFile, node2.getName(), detector);
+ }
+ if( node.getNodeType() == IPackageNode.TYPE_PACKAGE_FOLDER ) {
+ return new File(parentFile, ((IPackageFolder)node).getName(), ArchiveDetector.NULL);
+ }
+ return null;
+ }
+
+
+ /**
+ * Creates the file, folder, or archive represented by the node.
+ * Does nothing for filesets
+ * @param node
+ */
+ public static void createFile(final IPackageNode node) {
+ TrueZipUtil.syncExec(new Runnable() {
+ public void run() {
+ File f = getFile(node);
+ if( f != null ) {
+ f.mkdirs();
+ }
+ }
+ });
+ }
+
+}
More information about the jboss-cvs-commits
mailing list