Search in sources :

Example 1 with ClassPath

use of com.kyj.fx.voeditor.visual.main.model.vo.ClassPath in project Gargoyle by callakrsos.

the class FileSearcher method listClases.

public static List<ProjectInfo> listClases(String classDirName) throws Exception {
    File file = new File(classDirName);
    // 기본적인 파일의 존재유무 및 디렉토리인지 체크.
    if (!file.exists())
        throw new FileNotFoundException(file + " Not found!");
    //
    if (!file.isDirectory())
        throw new IllegalArgumentException("only directory.");
    /*
		 * 디렉토리안에 클래스패스 정보가 존재하는지 확인하고 존재한다면 classpath에 기술된 정보 기준으로 클래스 파일을
		 * 로드한다. 프로그램내에서 workspace를 선택한 경우일수있고, 프로젝트를 선택한 두가지의 경우가 있기때문에 두가지의
		 * 케이스를 고려한 로직이 들어간다.
		 */
    /*
		 * 일단 워크스페이스를 선택한경우라고 가정하고 워크스페이스내에 폴더들을 순차적으로 돌아보면서 classpath의 존재유무를 찾고
		 * 존재하는케이스는 따로 모아놓는다. 파일레벨은 워크스페이스(0레벨)-프로젝트(1레벨)로 가정하여 1레벨까지만 이동한다.
		 */
    List<File> listFiles = findClassPaths(file);
    /*
		 * classpath파일을 찾은경우 그 파일path를 기준으로 클래스들을 로딩한다.
		 */
    List<ProjectInfo> allClasses = new ArrayList<>();
    if (listFiles != null && !listFiles.isEmpty())
        LOGGER.debug(" im will working...");
    long startTime = System.currentTimeMillis();
    int searchedDirCount = 0;
    StringBuffer srchedDirNames = new StringBuffer();
    for (File f : listFiles) {
        try {
            ClassPath parsingClassPath = parsingClassPath(f.getAbsolutePath());
            // 프로젝트파일.
            File projectFile = f.getParentFile();
            // output 속성값의 존재유무만 확인하여 컴파일되는 경로를 찾는다.
            List<ProjectInfo> collect = parsingClassPath.toStream().filter(entry -> {
                boolean notEmpty = ValueUtil.isNotEmpty(entry.getOutput());
                LOGGER.debug(String.format("srch entry path : %s is Traget %b ", entry.getPath(), notEmpty));
                return notEmpty;
            }).map(pram -> pram.getOutput()).distinct().parallel().flatMap(new Function<String, Stream<ProjectInfo>>() {

                @Override
                public Stream<ProjectInfo> apply(String entry) {
                    LOGGER.debug(String.format("entry : %s", entry));
                    File compiledFilePath = new File(projectFile, entry);
                    int length = compiledFilePath.getAbsolutePath().length() + 1;
                    List<String> findClases = findClases(projectFile.getAbsolutePath(), compiledFilePath, length);
                    LOGGER.debug(compiledFilePath.toString());
                    LOGGER.debug(findClases.toString());
                    LOGGER.debug(String.valueOf(findClases.size()));
                    ProjectInfo classInfo = new ProjectInfo();
                    classInfo.setProjectName(projectFile.getName());
                    classInfo.setProjectDir(compiledFilePath.getAbsolutePath());
                    classInfo.setClasses(findClases);
                    return Stream.of(classInfo);
                }
            }).collect(Collectors.toList());
            allClasses.addAll(collect);
            searchedDirCount++;
            srchedDirNames.append(f.getAbsolutePath()).append(SystemUtils.LINE_SEPARATOR);
        } catch (SAXParseException e) {
            LOGGER.error(String.format("정상적인 XML 형태가 아님. 파일명 :  %s", f.getAbsolutePath()));
            LOGGER.error(String.format("%d 행 :: %d 열", e.getLineNumber(), e.getColumnNumber()));
        }
    }
    long endTime = System.currentTimeMillis();
    long costMillisend = endTime - startTime;
    LOGGER.debug(String.format("Total Cost time : %s (ms) searched Directory Count : %d ", costMillisend, searchedDirCount));
    LOGGER.debug(String.format("Searched Dirs info \n%s", srchedDirNames.toString()));
    return allClasses;
}
Also used : URL(java.net.URL) ZipUtil(com.kyj.fx.voeditor.visual.util.ZipUtil) LoggerFactory(org.slf4j.LoggerFactory) Function(java.util.function.Function) Supplier(java.util.function.Supplier) MimetypesFileTypeMap(javax.activation.MimetypesFileTypeMap) ArrayList(java.util.ArrayList) URLClassLoader(java.net.URLClassLoader) Document(org.w3c.dom.Document) Node(org.w3c.dom.Node) NamedNodeMap(org.w3c.dom.NamedNodeMap) Method(java.lang.reflect.Method) SystemUtils(org.apache.commons.lang.SystemUtils) ClassPathEntry(com.kyj.fx.voeditor.visual.main.model.vo.ClassPathEntry) InputSource(org.xml.sax.InputSource) Logger(org.slf4j.Logger) NodeList(org.w3c.dom.NodeList) MalformedURLException(java.net.MalformedURLException) Predicate(java.util.function.Predicate) ClassPath(com.kyj.fx.voeditor.visual.main.model.vo.ClassPath) ValueUtil(com.kyj.fx.voeditor.visual.util.ValueUtil) FileInputStream(java.io.FileInputStream) Reader(java.io.Reader) ConfigResourceLoader(com.kyj.fx.voeditor.visual.momory.ConfigResourceLoader) InputStreamReader(java.io.InputStreamReader) Collectors(java.util.stream.Collectors) File(java.io.File) FileNotFoundException(java.io.FileNotFoundException) StringUtils(org.h2.util.StringUtils) List(java.util.List) SAXParseException(org.xml.sax.SAXParseException) Stream(java.util.stream.Stream) DocumentBuilder(javax.xml.parsers.DocumentBuilder) FileTypeMap(javax.activation.FileTypeMap) DocumentBuilderFactory(javax.xml.parsers.DocumentBuilderFactory) ClassPath(com.kyj.fx.voeditor.visual.main.model.vo.ClassPath) FileNotFoundException(java.io.FileNotFoundException) ArrayList(java.util.ArrayList) Function(java.util.function.Function) SAXParseException(org.xml.sax.SAXParseException) File(java.io.File)

Example 2 with ClassPath

use of com.kyj.fx.voeditor.visual.main.model.vo.ClassPath in project Gargoyle by callakrsos.

the class DynamicClassLoaderTest method loadTest3.

/**
	 * classpath를 찾고 classpath의 컴파일 폴더를 기준으로 컴파일을 처리한뒤 정상적으로 특정클래스가 로딩되는지를
	 * 테스트한다.
	 * 
	 * @작성자 : KYJ
	 * @작성일 : 2015. 10. 26.
	 * @throws Exception
	 */
@Test
public void loadTest3() throws Exception {
    ClassPath parsingClassPath = DynamicClassLoader.parsingClassPath("C:/Users/KYJ/JAVA_FX/webWorkspace");
    List<ClassPathEntry> entryFilter = parsingClassPath.entryFilter(entry -> ValueUtil.isNotEmpty(entry.getOutput()));
    entryFilter.forEach(entry -> {
        try {
            String filePathName = parsingClassPath.getFilePathName();
            System.out.println(filePathName);
            String replaceFirst = filePathName.replaceFirst(".classPath", "");
            String output = entry.getOutput();
            System.out.println(output);
            System.out.println("output");
            String classesLocation = replaceFirst + output;
            System.out.println(classesLocation);
            List<ProjectInfo> listClases = DynamicClassLoader.listClases(classesLocation);
            if (listClases.isEmpty())
                return;
            ProjectInfo projectInfo = listClases.get(0);
            List<String> classes = projectInfo.getClasses();
            for (String clzz : classes) {
                DynamicClassLoader.load(classesLocation, clzz);
            }
            System.out.println("load ok.");
        } catch (Exception e) {
            e.printStackTrace();
        }
    });
}
Also used : ClassPath(com.kyj.fx.voeditor.visual.main.model.vo.ClassPath) ProjectInfo(com.kyj.fx.voeditor.visual.loder.ProjectInfo) ClassPathEntry(com.kyj.fx.voeditor.visual.main.model.vo.ClassPathEntry) Test(org.junit.Test)

Example 3 with ClassPath

use of com.kyj.fx.voeditor.visual.main.model.vo.ClassPath in project Gargoyle by callakrsos.

the class FileSearcher method listSources.

public static List<ProjectInfo> listSources(String classDirName) throws Exception {
    File file = new File(classDirName);
    // 기본적인 파일의 존재유무 및 디렉토리인지 체크.
    if (!file.exists())
        throw new FileNotFoundException(file + " Not found!");
    //
    if (!file.isDirectory())
        throw new IllegalArgumentException("only directory.");
    /*
		 * 디렉토리안에 클래스패스 정보가 존재하는지 확인하고 존재한다면 classpath에 기술된 정보 기준으로 클래스 파일을
		 * 로드한다. 프로그램내에서 workspace를 선택한 경우일수있고, 프로젝트를 선택한 두가지의 경우가 있기때문에 두가지의
		 * 케이스를 고려한 로직이 들어간다.
		 */
    /*
		 * 일단 워크스페이스를 선택한경우라고 가정하고 워크스페이스내에 폴더들을 순차적으로 돌아보면서 classpath의 존재유무를 찾고
		 * 존재하는케이스는 따로 모아놓는다. 파일레벨은 워크스페이스(0레벨)-프로젝트(1레벨)로 가정하여 1레벨까지만 이동한다.
		 */
    List<File> listFiles = findClassPaths(file);
    /*
		 * classpath파일을 찾은경우 그 파일path를 기준으로 클래스들을 로딩한다.
		 */
    List<ProjectInfo> allClasses = new ArrayList<>();
    if (listFiles != null && !listFiles.isEmpty())
        LOGGER.debug(" im will working...");
    long startTime = System.currentTimeMillis();
    int searchedDirCount = 0;
    StringBuffer srchedDirNames = new StringBuffer();
    for (File f : listFiles) {
        try {
            ClassPath parsingClassPath = parsingClassPath(f.getAbsolutePath());
            // 프로젝트파일.
            File projectFile = f.getParentFile();
            // output 속성값의 존재유무만 확인하여 컴파일되는 경로를 찾는다.
            List<ProjectInfo> collect = parsingClassPath.toStream().filter(entry -> {
                boolean notEmpty = ValueUtil.isNotEmpty(entry.getPath());
                LOGGER.debug(String.format("srch entry path : %s is Traget %b ", entry.getPath(), notEmpty));
                return notEmpty;
            }).filter(entry -> {
                return StringUtils.equals("src", entry.getKind());
            }).map(pram -> pram.getPath()).distinct().parallel().flatMap(new Function<String, Stream<ProjectInfo>>() {

                @Override
                public Stream<ProjectInfo> apply(String entry) {
                    LOGGER.debug(String.format("entry : %s", entry));
                    File compiledFilePath = new File(projectFile, entry);
                    int length = compiledFilePath.getAbsolutePath().length() + 1;
                    List<String> findJavaSources = findSource(projectFile.getAbsolutePath(), compiledFilePath, length);
                    LOGGER.debug(compiledFilePath.toString());
                    LOGGER.debug(findJavaSources.toString());
                    LOGGER.debug(String.valueOf(findJavaSources.size()));
                    ProjectInfo classInfo = new ProjectInfo();
                    classInfo.setProjectName(projectFile.getName());
                    classInfo.setProjectDir(compiledFilePath.getAbsolutePath());
                    classInfo.setJavaSources(findJavaSources);
                    return Stream.of(classInfo);
                }
            }).collect(Collectors.toList());
            allClasses.addAll(collect);
            searchedDirCount++;
            srchedDirNames.append(f.getAbsolutePath()).append(SystemUtils.LINE_SEPARATOR);
        } catch (SAXParseException e) {
            LOGGER.error(String.format("정상적인 XML 형태가 아님. 파일명 :  %s", f.getAbsolutePath()));
            LOGGER.error(String.format("%d 행 :: %d 열", e.getLineNumber(), e.getColumnNumber()));
        }
    }
    long endTime = System.currentTimeMillis();
    long costMillisend = endTime - startTime;
    LOGGER.debug(String.format("Total Cost time : %s (ms) searched Directory Count : %d ", costMillisend, searchedDirCount));
    LOGGER.debug(String.format("Searched Dirs info \n%s", srchedDirNames.toString()));
    return allClasses;
}
Also used : URL(java.net.URL) ZipUtil(com.kyj.fx.voeditor.visual.util.ZipUtil) LoggerFactory(org.slf4j.LoggerFactory) Function(java.util.function.Function) Supplier(java.util.function.Supplier) MimetypesFileTypeMap(javax.activation.MimetypesFileTypeMap) ArrayList(java.util.ArrayList) URLClassLoader(java.net.URLClassLoader) Document(org.w3c.dom.Document) Node(org.w3c.dom.Node) NamedNodeMap(org.w3c.dom.NamedNodeMap) Method(java.lang.reflect.Method) SystemUtils(org.apache.commons.lang.SystemUtils) ClassPathEntry(com.kyj.fx.voeditor.visual.main.model.vo.ClassPathEntry) InputSource(org.xml.sax.InputSource) Logger(org.slf4j.Logger) NodeList(org.w3c.dom.NodeList) MalformedURLException(java.net.MalformedURLException) Predicate(java.util.function.Predicate) ClassPath(com.kyj.fx.voeditor.visual.main.model.vo.ClassPath) ValueUtil(com.kyj.fx.voeditor.visual.util.ValueUtil) FileInputStream(java.io.FileInputStream) Reader(java.io.Reader) ConfigResourceLoader(com.kyj.fx.voeditor.visual.momory.ConfigResourceLoader) InputStreamReader(java.io.InputStreamReader) Collectors(java.util.stream.Collectors) File(java.io.File) FileNotFoundException(java.io.FileNotFoundException) StringUtils(org.h2.util.StringUtils) List(java.util.List) SAXParseException(org.xml.sax.SAXParseException) Stream(java.util.stream.Stream) DocumentBuilder(javax.xml.parsers.DocumentBuilder) FileTypeMap(javax.activation.FileTypeMap) DocumentBuilderFactory(javax.xml.parsers.DocumentBuilderFactory) ClassPath(com.kyj.fx.voeditor.visual.main.model.vo.ClassPath) FileNotFoundException(java.io.FileNotFoundException) ArrayList(java.util.ArrayList) Function(java.util.function.Function) SAXParseException(org.xml.sax.SAXParseException) File(java.io.File)

Example 4 with ClassPath

use of com.kyj.fx.voeditor.visual.main.model.vo.ClassPath in project Gargoyle by callakrsos.

the class FileSearcher method parsingClassPath.

// static class RuntimeJarLoader {
//
// public static void loadJarIndDir(String dir) {
// final URLClassLoader loader = (URLClassLoader)
// ClassLoader.getSystemClassLoader();
// loadJarIndDir(loader, dir);
// }
//
// public static void loadJarIndDir(ClassLoader loader, String dir) {
// try {
// final Method method = URLClassLoader.class.getDeclaredMethod("addURL",
// new Class[] { URL.class });
// method.setAccessible(true);
//
// new File(dir).listFiles(new FileFilter() {
// public boolean accept(File jar) {
// // jar 파일인 경우만 로딩
// if (jar.toString().toLowerCase().contains(".jar")) {
// try {
// // URLClassLoader.addURL(URL url) 메소드 호출
// method.invoke(loader, new Object[] { jar.toURI().toURL() });
// System.out.println(jar.getName() + " is loaded.");
// } catch (Exception e) {
// System.out.println(jar.getName() + " can't load.");
// }
// }
// return false;
// }
// });
// } catch (Exception e) {
// throw new RuntimeException(e);
// }
// }
// }
/**
	 * classPath의 정보를 파싱하여 데이터셋으로 반환
	 *
	 * @작성자 : KYJ
	 * @작성일 : 2015. 10. 26.
	 * @param filePathName
	 * @return
	 * @throws Exception
	 */
public static ClassPath parsingClassPath(String filePathName) throws Exception {
    DocumentBuilderFactory newInstance = DocumentBuilderFactory.newInstance();
    DocumentBuilder builder = newInstance.newDocumentBuilder();
    {
        FileTypeMap defaultFileTypeMap = MimetypesFileTypeMap.getDefaultFileTypeMap();
        String contentType = defaultFileTypeMap.getContentType(filePathName);
        LOGGER.debug(String.format("File path Name : %s Content type : %s ", filePathName, contentType));
    }
    Reader reader = new InputStreamReader(new FileInputStream(new File(filePathName)), ENCODING);
    InputSource is = new InputSource(reader);
    Document parse = builder.parse(is);
    ClassPath classPath = new ClassPath();
    classPath.setFilePathName(filePathName);
    classPath.setApplyedEncoding(ENCODING);
    NodeList elementsByTagName2 = parse.getElementsByTagName("classpath");
    int length = elementsByTagName2.getLength();
    for (int i = 0; i < length; i++) {
        Node classPathNode = elementsByTagName2.item(i);
        NodeList childNodes = classPathNode.getChildNodes();
        int classEntrySize = childNodes.getLength();
        for (int e = 0; e < classEntrySize; e++) {
            Node classEntryNode = childNodes.item(e);
            NamedNodeMap attributes = classEntryNode.getAttributes();
            if (attributes == null)
                continue;
            // 코드에서 필요로하는 부분만 XML을 파싱해서 데이터셋에 담는다.
            String kind = emptyThan(attributes.getNamedItem("kind"));
            String output = emptyThan(attributes.getNamedItem("output"));
            String path = emptyThan(attributes.getNamedItem("path"));
            ClassPathEntry classPathEntry = new ClassPathEntry(kind, output, path);
            classPath.addEntry(classPathEntry);
        }
    }
    return classPath;
}
Also used : ClassPath(com.kyj.fx.voeditor.visual.main.model.vo.ClassPath) InputSource(org.xml.sax.InputSource) DocumentBuilderFactory(javax.xml.parsers.DocumentBuilderFactory) NamedNodeMap(org.w3c.dom.NamedNodeMap) InputStreamReader(java.io.InputStreamReader) NodeList(org.w3c.dom.NodeList) Node(org.w3c.dom.Node) Reader(java.io.Reader) InputStreamReader(java.io.InputStreamReader) Document(org.w3c.dom.Document) FileInputStream(java.io.FileInputStream) ClassPathEntry(com.kyj.fx.voeditor.visual.main.model.vo.ClassPathEntry) DocumentBuilder(javax.xml.parsers.DocumentBuilder) MimetypesFileTypeMap(javax.activation.MimetypesFileTypeMap) FileTypeMap(javax.activation.FileTypeMap) File(java.io.File)

Example 5 with ClassPath

use of com.kyj.fx.voeditor.visual.main.model.vo.ClassPath in project Gargoyle by callakrsos.

the class DynamicClassLoaderTest method classPathTest.

/**
	 * 
	 * classpath파일을 찾은경우 classpath파일안의 컴파일 폴더를 찾는 테스트코드
	 * 
	 * @작성자 : KYJ
	 * @작성일 : 2015. 10. 26.
	 * @throws Exception
	 */
@Test
public void classPathTest() throws Exception {
    String filePathName = "C:\\G-MES2.0\\workspace\\gmes2-model\\.classPath";
    ClassPath parsingClassPath = DynamicClassLoader.parsingClassPath(filePathName);
    List<ClassPathEntry> entryFilter = parsingClassPath.entryFilter(entry -> ValueUtil.isNotEmpty(entry.getOutput()));
    entryFilter.forEach(System.out::println);
}
Also used : ClassPath(com.kyj.fx.voeditor.visual.main.model.vo.ClassPath) ClassPathEntry(com.kyj.fx.voeditor.visual.main.model.vo.ClassPathEntry) Test(org.junit.Test)

Aggregations

ClassPath (com.kyj.fx.voeditor.visual.main.model.vo.ClassPath)5 ClassPathEntry (com.kyj.fx.voeditor.visual.main.model.vo.ClassPathEntry)5 File (java.io.File)3 FileInputStream (java.io.FileInputStream)3 InputStreamReader (java.io.InputStreamReader)3 Reader (java.io.Reader)3 FileTypeMap (javax.activation.FileTypeMap)3 MimetypesFileTypeMap (javax.activation.MimetypesFileTypeMap)3 DocumentBuilder (javax.xml.parsers.DocumentBuilder)3 DocumentBuilderFactory (javax.xml.parsers.DocumentBuilderFactory)3 Document (org.w3c.dom.Document)3 NamedNodeMap (org.w3c.dom.NamedNodeMap)3 Node (org.w3c.dom.Node)3 NodeList (org.w3c.dom.NodeList)3 InputSource (org.xml.sax.InputSource)3 ConfigResourceLoader (com.kyj.fx.voeditor.visual.momory.ConfigResourceLoader)2 ValueUtil (com.kyj.fx.voeditor.visual.util.ValueUtil)2 ZipUtil (com.kyj.fx.voeditor.visual.util.ZipUtil)2 FileNotFoundException (java.io.FileNotFoundException)2 Method (java.lang.reflect.Method)2