Java tutorial
/* * Copyright 2012 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * 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. * * Revision History * Author Date Description * --------------- ---------------- ------------ * Sang-cheon Park 2012. 9. 20. First Draft. */ package com.athena.chameleon.engine.core.converter; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStream; import java.util.HashMap; import java.util.List; import java.util.Map; import javax.inject.Inject; import javax.inject.Named; import org.apache.commons.io.IOUtils; import org.apache.commons.lang.ArrayUtils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.util.Assert; import com.athena.chameleon.common.utils.ThreadLocalUtil; import com.athena.chameleon.engine.constant.ChameleonConstants; import com.athena.chameleon.engine.entity.pdf.AnalyzeDefinition; import com.athena.chameleon.engine.entity.pdf.ArchiveType; import com.athena.chameleon.engine.entity.pdf.FileSummary; import com.athena.chameleon.engine.entity.pdf.FileType; import com.athena.chameleon.engine.entity.pdf.PDFMetadataDefinition; import com.athena.chameleon.engine.policy.Policy; import com.athena.chameleon.engine.threadpool.executor.ChameleonThreadPoolExecutor; import com.athena.chameleon.engine.threadpool.task.FileEncodingConvertTask; import com.ibm.icu.text.CharsetDetector; import com.ibm.icu.text.CharsetMatch; /** * <pre> * ? ? ? ?? ? ? ?? ConvertEncodingTask ? Runnable Task ? * ThreadPoolExecutor ? . * </pre> * * @author Sang-cheon Park * @version 1.0 */ @Component("fileEncodingConverter") public class FileEncodingConverter { private static final Logger logger = LoggerFactory.getLogger(FileEncodingConverter.class); @Inject @Named("policy") private Policy policy; @Inject @Named("taskExecutor") private ChameleonThreadPoolExecutor executor; private AnalyzeDefinition analyzeDefinition; private FileType[] fileTypes = FileType.values(); private Map<FileType, FileSummary> fileSummaryMap; private FileSummary fileSummary; private List<File> warFileList; private List<File> jarFileList; /** * <pre> * * </pre> * * @param fqfn */ public void convert(String fqfn, AnalyzeDefinition analyzeDefinition) { Assert.notNull(fqfn, "fqfn must not be null"); Assert.notNull(analyzeDefinition, "analyzeDefinition must not be null"); convert(new File(fqfn), analyzeDefinition); }//end of convert() /** * <pre> * * </pre> * @param dir */ public void convert(File file, AnalyzeDefinition analyzeDefinition) { Assert.notNull(file, "file must not be null"); Assert.notNull(analyzeDefinition, "analyzeDefinition must not be null"); Assert.isTrue(file.exists(), file + " does not exist."); logger.debug("Convert Target Path or File : [{}]", file.getAbsolutePath()); this.analyzeDefinition = analyzeDefinition; fileSummaryMap = new HashMap<FileType, FileSummary>(); for (FileType fileType : fileTypes) { fileSummary = new FileSummary(); fileSummary.setFileType(fileType); fileSummaryMap.put(fileType, fileSummary); } PDFMetadataDefinition metadataDefinition = (PDFMetadataDefinition) ThreadLocalUtil .get(ChameleonConstants.PDF_METADATA_DEFINITION); analyzeDefinition.setFileName(file.getAbsolutePath()); analyzeDefinition.setFileSummaryMap(fileSummaryMap); warFileList = analyzeDefinition.getWarFileList(); jarFileList = analyzeDefinition.getJarFileList(); convertAll(file); if (policy.getConvertYn()) { executor.getExecutor().shutdown(); try { while (!executor.getExecutor().isTerminated()) { Thread.sleep(100); } } catch (InterruptedException e) { e.printStackTrace(); } } // Runnable Task ? ? Total Count . int totalCount = 0; for (FileType fileType : fileTypes) { if (!fileType.equals(FileType.SUM)) { totalCount += fileSummaryMap.get(fileType).getFileCount(); } } fileSummaryMap.get(FileType.SUM).setFileCount(totalCount); for (FileType fileType : fileTypes) { totalCount += fileSummaryMap.get(fileType).getFileCount(); logger.info("File Type : [{}], \tCount : [{}], \tSource Encoding : [{}], \tTarget Encoding : [{}]", new Object[] { String.format("%12s", fileSummaryMap.get(fileType).getFileType().toString()), String.format("%5s", fileSummaryMap.get(fileType).getFileCount()), String.format("%12s", fileSummaryMap.get(fileType).getSourceEncoding()), String.format("%5s", fileSummaryMap.get(fileType).getTargetEncoding()) }); } // ? ?? ? ? PDFMetadataDefinition? . String extension = file.getName().substring(file.getName().lastIndexOf(".") + 1).toLowerCase(); if (ArchiveType.ZIP.value().equals(extension)) { metadataDefinition.setZipDefinition(analyzeDefinition); } else if (ArchiveType.EAR.value().equals(extension)) { metadataDefinition.setEarDefinition(analyzeDefinition); } else if (ArchiveType.WAR.value().equals(extension)) { metadataDefinition.addWarDefinitionMap(file.getName(), analyzeDefinition); } else if (ArchiveType.JAR.value().equals(extension)) { metadataDefinition.addJarDefinitionMap(file.getName(), analyzeDefinition); } }//end of convert() /** * <pre> * * </pre> * @param file */ private void convertAll(File file) { if (file.isDirectory()) { // EJB Archive ? Exploded WEB Directory ? EJB Directory? ? . if (warFileList.contains(file) || jarFileList.contains(file)) { return; } fileSummary = fileSummaryMap.get(FileType.DIRECTORY); fileSummary.addCount(); File[] files = null; files = file.listFiles(); for (File f : files) { convertAll(f); } } else { String extension = file.getName().substring(file.getName().lastIndexOf(".") + 1).toLowerCase(); for (FileType fileType : fileTypes) { if (fileType.value().equals(extension)) { fileSummary = fileSummaryMap.get(fileType); fileSummary.addCount(); if (fileType.equals(FileType.JAR) && file.getParent().endsWith("lib")) { // xerces.jar, xalan.jar, xml-api.jar, jboss-*.jar ?? if (file.getName().startsWith("xerces") || file.getName().startsWith("xalan") || file.getName().startsWith("xml-api") || file.getName().startsWith("jboss-")) { // ? ?? ? analyzeDefinition.getDeleteLibraryList().add(file.getName()); //file.delete(); // ?? .bak ? . file.renameTo(new File(file.getAbsolutePath() + ".bak")); } else { // ?? ? ?? analyzeDefinition.getLibraryList().add(file.getName()); analyzeDefinition.getLibraryFullPathList().add(file.getAbsolutePath()); } continue; } // ? ? ?? ?? ? ? ? ?? ? ?? ?. if ((fileSummary.getSourceEncoding().equals("N/A") || fileSummary.getSourceEncoding().equals(policy.getDefaultEncoding())) && !fileType.equals(FileType.CLASS) && !fileType.equals(FileType.JAR)) { try { InputStream input = new FileInputStream(file); byte[] data = IOUtils.toByteArray(input, file.length()); IOUtils.closeQuietly(input); CharsetDetector detector = new CharsetDetector(); detector.setDeclaredEncoding(policy.getDefaultEncoding()); detector.setText(data); CharsetMatch cm = detector.detect(); fileSummary.setSourceEncoding(cm.getName()); if (policy.getConvertYn()) { fileSummary.setTargetEncoding(policy.getDefaultEncoding()); } } catch (FileNotFoundException e) { logger.error("FileNotFoundException has occurred.", e); } catch (IOException e) { logger.error("IOException has occurred.", e); } } } } // suffix property? ? ? ?? if (policy.getConvertYn() && ArrayUtils.contains(policy.getSuffix(), extension)) { executor.execute(new FileEncodingConvertTask(file, policy.getDefaultEncoding())); } } }//end of convertAll() }//end of FileEncodingConverter.java