/* * Copyright 2015 Red Hat, Inc. and/or its affiliates. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.kie.eclipse.utils; import java.io.BufferedInputStream; import java.io.BufferedReader; import java.io.ByteArrayInputStream; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.OutputStream; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; import java.util.ArrayList; import java.util.Arrays; import java.util.Enumeration; import java.util.List; import java.util.jar.JarEntry; import java.util.jar.JarFile; import org.eclipse.core.resources.ICommand; import org.eclipse.core.resources.IContainer; import org.eclipse.core.resources.IFile; import org.eclipse.core.resources.IFolder; import org.eclipse.core.resources.IProject; import org.eclipse.core.resources.IProjectDescription; import org.eclipse.core.resources.IResource; import org.eclipse.core.resources.ResourcesPlugin; 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.SubMonitor; import org.eclipse.jdt.core.IClasspathEntry; import org.eclipse.jdt.core.IJavaProject; import org.eclipse.jdt.core.IPackageFragmentRoot; import org.eclipse.jdt.core.JavaCore; import org.eclipse.jdt.core.JavaModelException; import org.eclipse.jdt.internal.core.JavaModelManager; import org.eclipse.jdt.ui.PreferenceConstants; public class FileUtils { private FileUtils() { } public static String readFile(IFile file) throws CoreException { InputStream inputStream = file.getContents(); BufferedReader reader = new BufferedReader(new InputStreamReader(inputStream)); StringBuilder sb = new StringBuilder(); try { char[] buf = new char[1024]; int numRead=0; while((numRead=reader.read(buf)) != -1){ sb.append(buf, 0, numRead); } } catch (IOException e) { return null; } finally { try { if (reader != null) { reader.close(); } if (inputStream != null) { inputStream.close(); } } catch (IOException e) { // Nothing } } return sb.toString(); } public static void mkdirs(IResource resource, IProgressMonitor monitor) throws CoreException { IContainer parent = resource.getParent(); if (!parent.exists()) { mkdirs(resource.getParent(), monitor); } if (resource instanceof IFolder && !resource.exists()) ((IFolder)resource).create(true, true, monitor); } public static boolean deleteFolder(File file) { File[] flist = null; if (file == null) { return false; } if (file.isFile()) { return file.delete(); } if (!file.isDirectory()) { return false; } flist = file.listFiles(); if (flist != null && flist.length > 0) { for (File f : flist) { if (!deleteFolder(f)) { return false; } } } return file.delete(); } public static int extractJarFile(java.io.File jarFile, IProject project, IProgressMonitor monitor) throws IOException, CoreException { JarFile jar = new java.util.jar.JarFile(jarFile); InputStream is = null; int fileCount = 0; try { // System.out.println("Jar: "+jar.getName()); // for (Entry<Object, Object> e : jar.getManifest().getMainAttributes().entrySet()) { // System.out.println(" "+e.getKey() + "=" + e.getValue()); // } SubMonitor subMonitor = SubMonitor.convert(monitor, jar.size()); Enumeration<JarEntry> enumEntries = jar.entries(); while (enumEntries.hasMoreElements()) { JarEntry entry = enumEntries.nextElement(); if (entry.isDirectory()) { IFolder folder = project.getFolder(entry.getName()); if (!folder.exists()) { folder.create(true, true, monitor); } } else { subMonitor.setTaskName("Creating file "+entry.getName()); IFile file = project.getFile(entry.getName()); mkdirs(file, monitor); is = jar.getInputStream(entry); if (file.exists()) file.setContents(is, true, false, monitor); else file.create(is, true, monitor); ++fileCount; subMonitor.worked(1); } } subMonitor.done(); } finally { jar.close(); if (is!=null) is.close(); } return fileCount; } public static java.io.File downloadFile(URL url, IProgressMonitor monitor) throws IOException { URLConnection conn = url.openConnection(); if (conn instanceof HttpURLConnection) ((HttpURLConnection)conn).setRequestMethod("GET"); java.io.File jarFile = null; int length = conn.getContentLength(); final int buffersize = 1024; final int blocks = length/buffersize; SubMonitor subMonitor = SubMonitor.convert(monitor, blocks); InputStream istream = conn.getInputStream(); OutputStream ostream = null; try { subMonitor.beginTask("Downloading "+url.getFile()+" from "+url.getHost(), blocks); jarFile = java.io.File.createTempFile(url.getFile(), null); if (istream!=null) { ostream = new FileOutputStream(jarFile); int read = 0; byte[] bytes = new byte[buffersize]; int block = 1; int lastPercentDone = -1; while ((read = istream.read(bytes)) != -1 && !subMonitor.isCanceled()) { int percentDone = (int)(100 * ((float)block / (float)blocks)); if (percentDone != lastPercentDone && percentDone<=100) { subMonitor.setTaskName("Downloading "+url.toString()+" "+percentDone+"%"); lastPercentDone = percentDone; } ostream.write(bytes, 0, read); subMonitor.worked(1); ++block; } } } catch (Exception e) { e.printStackTrace(); } finally { if (istream!=null) istream.close(); if (ostream!=null) { ostream.flush(); ostream.close(); } if (subMonitor.isCanceled()) return null; subMonitor.done(); } return jarFile; } public static IProject getProjectHandle(String name) { return ResourcesPlugin.getWorkspace().getRoot().getProject(name); } public static void addJavaBuilder(IJavaProject project, IProgressMonitor monitor) throws CoreException { IProjectDescription description = project.getProject().getDescription(); ICommand[] commands = description.getBuildSpec(); ICommand[] newCommands = new ICommand[commands.length + 1]; System.arraycopy(commands, 0, newCommands, 0, commands.length); ICommand javaCommand = description.newCommand(); javaCommand.setBuilderName("org.eclipse.jdt.core.javabuilder"); newCommands[commands.length] = javaCommand; description.setBuildSpec(newCommands); project.getProject().setDescription(description, monitor); } public static void addMavenBuilder(IJavaProject project, IProgressMonitor monitor) throws CoreException { IProjectDescription description = project.getProject().getDescription(); ICommand[] commands = description.getBuildSpec(); ICommand[] newCommands = new ICommand[commands.length + 1]; System.arraycopy(commands, 0, newCommands, 0, commands.length); ICommand mavenCommand = description.newCommand(); mavenCommand.setBuilderName("org.eclipse.m2e.core.maven2Builder"); newCommands[commands.length] = mavenCommand; description.setBuildSpec(newCommands); project.getProject().setDescription(description, monitor); } public static void addBPMN2Builder(IJavaProject project, IProgressMonitor monitor) throws CoreException { IProjectDescription description = project.getProject().getDescription(); ICommand[] commands = description.getBuildSpec(); ICommand[] newCommands = new ICommand[commands.length + 2]; System.arraycopy(commands, 0, newCommands, 0, commands.length); ICommand bpmn2BuilderCommand = description.newCommand(); bpmn2BuilderCommand.setBuilderName("org.eclipse.bpmn2.modeler.core.bpmn2Builder"); newCommands[commands.length] = bpmn2BuilderCommand; ICommand wstValidationCommand = description.newCommand(); wstValidationCommand.setBuilderName("org.eclipse.wst.validation.validationbuilder"); newCommands[commands.length+1] = wstValidationCommand; description.setBuildSpec(newCommands); project.getProject().setDescription(description, monitor); } public static void addJavaNature(IProjectDescription projectDescription) { List<String> list = new ArrayList<String>(); list.addAll(Arrays.asList(projectDescription.getNatureIds())); list.add("org.eclipse.jdt.core.javanature"); projectDescription.setNatureIds((String[]) list.toArray(new String[list.size()])); } public static void addMavenNature(IProjectDescription projectDescription) { List<String> list = new ArrayList<String>(); list.addAll(Arrays.asList(projectDescription.getNatureIds())); list.add("org.eclipse.m2e.core.maven2Nature"); projectDescription.setNatureIds((String[]) list.toArray(new String[list.size()])); } public static void addBPMN2Nature(IProjectDescription projectDescription) { List<String> list = new ArrayList<String>(); list.addAll(Arrays.asList(projectDescription.getNatureIds())); list.add("org.eclipse.bpmn2.modeler.core.bpmn2Nature"); projectDescription.setNatureIds((String[]) list.toArray(new String[list.size()])); } public static void createMavenArtifacts(IJavaProject project, String groupId, String artifactId, String version, IProgressMonitor monitor) { try { String projectName = project.getProject().getName(); if (groupId==null || groupId.isEmpty()) groupId = projectName + ".group"; if (artifactId==null || artifactId.isEmpty()) artifactId = projectName; if (version==null || version.isEmpty()) version = "1.0.0-SNAPSHOT"; createProjectFile(project, monitor, generatePomProperties(groupId, artifactId, version), "src/main/resources/META-INF/maven", "pom.properties"); createProjectFile(project, monitor, generateEmptyPom(groupId, artifactId, version), null, "pom.xml"); } catch (CoreException e) { e.printStackTrace(); } } public static void createKJarArtifacts(IJavaProject project, IProgressMonitor monitor) { try { createProjectFile(project, monitor, generateKModule(), "src/main/resources/META-INF", "kmodule.xml"); } catch (CoreException e) { e.printStackTrace(); } } public static void createGitIgnore(IJavaProject project, IProgressMonitor monitor) { try { createProjectFile(project, monitor, generateGitIGnore(), null, ".gitignore"); } catch (CoreException e) { e.printStackTrace(); } } public static InputStream generateGitIGnore() { StringBuilder sb = new StringBuilder(); sb.append(".gitignore\n"); sb.append(".classpath\n"); sb.append(".project\n"); sb.append(".settings/\n"); return new ByteArrayInputStream(sb.toString().getBytes()); } public static InputStream generateKModule() { StringBuilder sb = new StringBuilder(); sb.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n"); sb.append("<kmodule xmlns=\"http://jboss.org/kie/6.0.0/kmodule\">\n"); // sb.append(" <kbase name=\"rules\" packages=\"rules\">\n"); // sb.append(" <ksession name=\"ksession-rules\"/>\n"); // sb.append(" </kbase>\n"); // // sb.append(" <kbase name=\"dtables\" packages=\"dtables\">\n"); // sb.append(" <ksession name=\"ksession-dtables\"/>\n"); // sb.append(" </kbase>\n"); // // sb.append(" <kbase name=\"process\" packages=\"process\">\n"); // sb.append(" <ksession name=\"ksession-process\"/>\n"); // sb.append(" </kbase>\n"); sb.append("</kmodule>\n"); return new ByteArrayInputStream(sb.toString().getBytes()); } public static InputStream generatePomProperties(String groupId, String artifactId, String version) { String pom = "groupId=" + groupId + "\n" + "artifactId=" + artifactId + "\n" + "version=" + version + "\n"; return new ByteArrayInputStream(pom.getBytes()); } public static InputStream generateEmptyPom(String groupId, String artifactId, String version) { String pom = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" + "<project xmlns=\"http://maven.apache.org/POM/4.0.0\" xmlns:xsi=\"http://www.w3.org/2001/XMLSchema-instance\"\n" + " xsi:schemaLocation=\"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd\">\n" + " <modelVersion>4.0.0</modelVersion>\n" + "\n" + " <groupId>" + groupId + "</groupId>\n" + " <artifactId>" + artifactId + "</artifactId>\n" + " <version>" + version + "</version>\n" + "</project>\n"; return new ByteArrayInputStream(pom.toString().getBytes()); } public static InputStream generatePom(InputStream template, String runtimeVersion, String groupId, String artifactId, String version) { BufferedInputStream is = new BufferedInputStream(template); StringBuilder contents = new StringBuilder(); java.util.Scanner scanner = new java.util.Scanner(is); while (true) { try { String line = scanner.nextLine(); if (line.contains("<groupId>###")) line = line.replaceFirst("###", groupId); else if (line.contains("<artifactId>###")) line = line.replaceFirst("###", artifactId); else if (line.contains("<version>###")) line = line.replaceFirst("###", version); else if (line.contains("<runtime.version>###")) line = line.replaceFirst("###", runtimeVersion); contents.append(line); contents.append("\n"); } catch (Exception e) { scanner.close(); break; } } return new ByteArrayInputStream(contents.toString().getBytes()); } public static void createOutputLocation(IJavaProject project, String folderName, IProgressMonitor monitor) throws JavaModelException, CoreException { IFolder folder = createFolder(project, folderName, monitor); IPath path = folder.getFullPath(); JavaModelManager.getJavaModelManager().getPerProjectInfo(project.getProject(), true); project.setRawClasspath(new IClasspathEntry[0], monitor); project.setOutputLocation(path, monitor); } public static void addFolderToClasspath(IJavaProject project, String folderName, boolean create, IProgressMonitor monitor) throws JavaModelException, CoreException { List<IClasspathEntry> list = new ArrayList<IClasspathEntry>(); list.addAll(Arrays.asList(project.getRawClasspath())); IFolder folder = project.getProject().getFolder(folderName); if (create || folder.exists()) { if (create) createFolder(folder, monitor); IPackageFragmentRoot ipackagefragmentroot = project.getPackageFragmentRoot(folder); list.add(JavaCore.newSourceEntry(ipackagefragmentroot.getPath())); project.setRawClasspath((IClasspathEntry[]) list.toArray(new IClasspathEntry[list.size()]), null); } } public static void addJRELibraries(IJavaProject project, IProgressMonitor monitor) throws JavaModelException { List<IClasspathEntry> list = new ArrayList<IClasspathEntry>(); list.addAll(Arrays.asList(project.getRawClasspath())); list.addAll(Arrays.asList(PreferenceConstants.getDefaultJRELibrary())); project.setRawClasspath((IClasspathEntry[]) list.toArray(new IClasspathEntry[list.size()]), monitor); } public static void addMavenLibraries(IJavaProject project, IProgressMonitor monitor) throws JavaModelException { List<IClasspathEntry> list = new ArrayList<IClasspathEntry>(); list.addAll(Arrays.asList(project.getRawClasspath())); list.add(JavaCore.newContainerEntry(new Path("org.eclipse.m2e.MAVEN2_CLASSPATH_CONTAINER"))); project.setRawClasspath((IClasspathEntry[]) list.toArray(new IClasspathEntry[list.size()]), monitor); } public static void addJUnitLibrary(IJavaProject project, IProgressMonitor monitor) throws JavaModelException { List<IClasspathEntry> list = new ArrayList<IClasspathEntry>(); list.addAll(Arrays.asList(project.getRawClasspath())); list.add(JavaCore.newContainerEntry(new Path("org.eclipse.jdt.junit.JUNIT_CONTAINER/4"))); project.setRawClasspath((IClasspathEntry[]) list .toArray(new IClasspathEntry[list.size()]), monitor); } public static IFolder createFolder(IJavaProject project, String folderName, IProgressMonitor monitor) throws CoreException { IFolder folder = project.getProject().getFolder(folderName); createFolder(folder, monitor); return folder; } public static void createFolder(IFolder folder, IProgressMonitor monitor) throws CoreException { IContainer container = folder.getParent(); if (container != null && !container.exists() && (container instanceof IFolder)) createFolder((IFolder) container, monitor); if (!folder.exists()) { folder.create(true, true, monitor); } } public static void createProjectFile(IJavaProject project, IProgressMonitor monitor, InputStream inputstream, String folderName, String fileName) throws CoreException { IFile file; if (folderName == null) { file = project.getProject().getFile(fileName); } else { IFolder folder = project.getProject().getFolder(folderName); file = folder.getFile(fileName); } if (!file.exists()) { if (file.getParent() instanceof IFolder) createFolder((IFolder)file.getParent(), monitor); file.create(inputstream, true, monitor); } else { file.setContents(inputstream, true, false, monitor); } } public static byte[] readStream(InputStream inputstream) throws IOException { byte bytes[] = (byte[]) null; int i = 0; byte tempBytes[] = new byte[1024]; for (int j = inputstream.read(tempBytes); j != -1; j = inputstream.read(tempBytes)) { byte tempBytes2[] = new byte[i + j]; if (i > 0) { System.arraycopy(bytes, 0, tempBytes2, 0, i); } System.arraycopy(tempBytes, 0, tempBytes2, i, j); bytes = tempBytes2; i += j; } return bytes; } }