package bs.util.web.tool.eclipse; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import java.util.Properties; import javax.swing.JTextArea; import javax.xml.stream.XMLInputFactory; import javax.xml.stream.XMLStreamConstants; import javax.xml.stream.XMLStreamException; import javax.xml.stream.XMLStreamReader; /** * Eclipse Project Properties Deal. * * @author Baishui2004 * @version 1.1 * @date 2013-4-5 */ public class ProjectPropertiesDeal implements ProjectPropertiesDealInterface { /** * Eclipse的Java Project、Dynamic Web Project或者MyEclipse的Web Project绝对路径地址. */ private String projectPath; /** * 解析文件'.project'以获取Project Name, 此种方法要求'.project'文件根节点的第一个name子节点即是Project Name. */ private String projectNameFile = "/.project"; /** * 解析文件'.settings/org.eclipse.jdt.core.prefs'以获取compileSource以及compileTarget. */ private String compilePropsFile = "/.settings/org.eclipse.jdt.core.prefs"; /** * 如果没有'.settings/org.eclipse.jdt.core.prefs'文件,则解析文件'.settings/org.eclipse.wst.common.project.facet.core.xml'以"installed java facet version". */ private String projectFacetCoreFile = "/.settings/org.eclipse.wst.common.project.facet.core.xml"; /** * 解析文件'.classpath'以获取javaSourcesPath以及outputPath. */ private String classpathFile = "/.classpath"; /** * 解析文件'.settings/.jsdtscope'以获取webappPath. */ private String webappPropsFile = "/.settings/.jsdtscope"; /** * Project Name. */ private String projectName; /** * Java Compile Source. */ private String compileSource; /** * Java Compile Target. */ private String compileTarget; /** * Java Sources path. */ private String[] javaSourcesPath; /** * Output classes path. */ private String outputPath; /** * 是否是Java Web Project. */ private boolean javaWebProject; /** * Project Webapp path. */ private String webappPath; /** * Main入口. * * <pre> * 只接受传入一个参数, 即Eclipse的Java Project、Dynamic Web Project或者MyEclipse的Web Project绝对路径地址. * </pre> */ public static void main(String[] args) throws IOException { if (args.length != 1) { throw new IllegalArgumentException("Parameters error."); } ProjectPropertiesDealInterface propertiesDeal = new ProjectPropertiesDeal(); propertiesDeal.deal(args[0]); } /** * 解析属性文件获得Project相关属性. */ public void deal(String projectPath) throws IOException { setProjectPath(projectPath); if (!isJavaOrJavaWebEclipseProject(projectPath)) { throw new IllegalArgumentException("The Path: \'" + projectPath + "\' not has a Eclipse Java Project, Dynamic Web Project or MyEclipse Web Project."); } dealProjectName(); dealCompileSourceAndTarget(); dealSourceAndOutput(); if (isJavaWebProject()) { dealWebappPath(); } print("************ Project properties Start ************"); print("Project Path: " + projectPath); print("Project Name: " + getProjectName()); print("Java Compile Source: " + getCompileSource()); print("Java Compile Target: " + getCompileTarget()); String[] javaSourcesPath = getJavaSourcesPath(); if (javaSourcesPath != null) { for (int i = 0; i < javaSourcesPath.length; i++) { print("Sources Path: " + javaSourcesPath[i]); } } print("Output Path: " + getOutputPath()); print("Is Java Web Project: " + isJavaWebProject()); if (isJavaWebProject()) { print("Webapp Path: " + getWebappPath()); } print("************ Project properties End ************\n"); } /** * 运行日志输出文本域. */ private JTextArea runLogTextArea; public void setRunLogTextArea(JTextArea runLogTextArea) { this.runLogTextArea = runLogTextArea; } /** * 输出. */ private void print(String log) { if (runLogTextArea != null) { runLogTextArea.append(log + "\n"); } else { System.out.print(log + "\n"); } } /** * 是否是Eclipse 的Java Project、Dynamic Web Project或者MyEclipse的Web Project. */ public boolean isJavaOrJavaWebEclipseProject(String projectPath) { if (!new File(projectPath + this.projectNameFile).exists()) { return false; } else if (!new File(projectPath + this.compilePropsFile).exists() && !new File(projectPath + this.projectFacetCoreFile).exists()) { return false; } else if (!new File(projectPath + this.classpathFile).exists()) { return false; } if (!new File(this.projectPath + this.webappPropsFile).exists()) { javaWebProject = false; } else { javaWebProject = true; } return true; } public boolean isJavaWebProject() { return this.javaWebProject; } public String getProjectPath() { return this.projectPath; } public void setProjectPath(String projectPath) { this.projectPath = projectPath; } public String getProjectName() { return this.projectName; } public String getCompileSource() { return this.compileSource; } public String getCompileTarget() { return this.compileTarget; } public String[] getJavaSourcesPath() { return this.javaSourcesPath; } public String getOutputPath() { return this.outputPath; } public String getWebappPath() { return this.webappPath; } /** * 解析文件'.project'以获取Project Name, 此种方法要求'.project'文件根节点的第一个name子节点即是Project Name. */ private void dealProjectName() throws FileNotFoundException { String xmlPath = this.projectPath + this.projectNameFile; parseXmlProperties(xmlPath, new XmlParse() { @Override public void parse(XMLStreamReader reader) throws XMLStreamException { boolean pdFlag = false; boolean pnFlag = false; while (reader.hasNext()) { int i = reader.next(); if (i == XMLStreamConstants.START_ELEMENT) { String elementName = reader.getLocalName(); if ("projectDescription".equals(elementName)) { pdFlag = true; } if (pdFlag && "name".equals(elementName)) { pnFlag = true; } } if (pnFlag && reader.hasText()) { projectName = reader.getText().trim(); break; } } } }); } /** * 解析文件'.settings/org.eclipse.jdt.core.prefs'以获取compileSource以及compileTarget. * 如果没有'.settings/org.eclipse.jdt.core.prefs'文件,则解析文件'.settings/org.eclipse.wst.common.project.facet.core.xml'以获取"installed java facet version". */ private void dealCompileSourceAndTarget() throws IOException { String filePath = this.projectPath + this.compilePropsFile; if (new File(filePath).exists()) { Properties properties = new Properties(); InputStream in = null; try { in = new FileInputStream(new File(filePath)); properties.load(in); } finally { if (in != null) { in.close(); } } compileSource = properties.getProperty("org.eclipse.jdt.core.compiler.source"); compileTarget = properties.getProperty("org.eclipse.jdt.core.compiler.compliance"); } else { String xmlPath = this.projectPath + this.projectFacetCoreFile; parseXmlProperties(xmlPath, new XmlParse() { @Override public void parse(XMLStreamReader reader) throws XMLStreamException { while (reader.hasNext()) { int i = reader.next(); if (i == XMLStreamConstants.START_ELEMENT) { String elementName = reader.getLocalName(); if ("installed".equals(elementName)) { String kind = reader.getAttributeValue(null, "facet"); if ("java".equals(kind)) { compileSource = reader.getAttributeValue(null, "version"); compileTarget = compileSource; } } } } } }); } } /** * 解析文件'.classpath'以获取javaSourcesPath以及outputPath. */ private void dealSourceAndOutput() throws FileNotFoundException { String xmlPath = this.projectPath + this.classpathFile; parseXmlProperties(xmlPath, new XmlParse() { @Override public void parse(XMLStreamReader reader) throws XMLStreamException { List<String> javaSourcesPaths = new ArrayList<String>(); while (reader.hasNext()) { int i = reader.next(); if (i == XMLStreamConstants.START_ELEMENT) { String elementName = reader.getLocalName(); if ("classpathentry".equals(elementName)) { String kind = reader.getAttributeValue(null, "kind"); String path = reader.getAttributeValue(null, "path"); if ("src".equals(kind)) { javaSourcesPaths.add(path); } else if ("output".equals(kind)) { outputPath = path; } } } } javaSourcesPath = new String[javaSourcesPaths.size()]; for (int i = 0; i < javaSourcesPath.length; i++) { javaSourcesPath[i] = javaSourcesPaths.get(i); } } }); } /** * 解析文件'.settings/.jsdtscope'以获取webappPath. */ private void dealWebappPath() throws FileNotFoundException { String xmlPath = this.projectPath + this.webappPropsFile; parseXmlProperties(xmlPath, new XmlParse() { @Override public void parse(XMLStreamReader reader) throws XMLStreamException { while (reader.hasNext()) { int i = reader.next(); if (i == XMLStreamConstants.START_ELEMENT) { String elementName = reader.getLocalName(); if ("classpathentry".equals(elementName)) { String kind = reader.getAttributeValue(null, "kind"); if ("src".equals(kind)) { webappPath = reader.getAttributeValue(null, "path"); } } } } } }); } /** * 解析XML接口. */ private interface XmlParse { void parse(XMLStreamReader reader) throws XMLStreamException; } /** * 解析XML. */ private static void parseXmlProperties(String xmlPath, XmlParse xmlParse) throws FileNotFoundException { XMLInputFactory factory = XMLInputFactory.newInstance(); InputStream stream = null; XMLStreamReader reader = null; try { stream = new FileInputStream(new File(xmlPath)); reader = factory.createXMLStreamReader(stream); xmlParse.parse(reader); } catch (XMLStreamException e) { e.printStackTrace(); } finally { if (stream != null) { try { stream.close(); } catch (IOException e) { e.printStackTrace(); } finally { if (reader != null) { try { reader.close(); } catch (XMLStreamException e) { e.printStackTrace(); } } } } } } }