Domanda

I need to extract all hard coded Strings values from all Java files in a Java project
Into a Java Constant file

for example

Input

// Java file number 1
public class A {    
    public static void main(String[] args) {
        System.out.println("HardCoded String A");
    }
}

// Java file number 2
public class B {    
    public static void main(String[] args) {
        System.out.println("HardCoded String B");
    }
}

Output

// a Java Constant file
public class MyConstants {  
    public static final String HardCodedString_01 = "HardCoded String A";
    public static final String HardCodedString_02 = "HardCoded String B";   
}

// Java file number 1
public class A {    
    public static void main(String[] args) {
        System.out.println(MyConstants.HardCodedString_01);
    }
}

// Java file number 2
public class B {    
    public static void main(String[] args) {
        System.out.println(MyConstants.HardCodedString_01);
    }
}

I am aware of Externalize Strings for Eclipse
enter image description here BUT it works over one file not all files

And when i check this post
Extract all string from a java project
I could not find the link of provided presentation

Also i check this post
Externalize strings for Android project
But that is provided for Android projects not Java projects

È stato utile?

Soluzione

First to inspect all hard coded Strings values from all using Eclipse
The core idea is that
The Regular Expression of Java hard coded String value is "*"
So
We can do that Using search by this criteria
For example

Eclipse Search Inquiry
enter image description here

Eclipse Search Result

enter image description here

Altri suggerimenti

Might be a over-engineered solution, but give a try to sonarqube which can give you static analysis of code and much more than just hard-coded string values.

If you are looking for a code to do that, you can try linux commandline (e.g. grep -rnw '/path/to/somewhere/' -e "pattern") solutions.

I'm guessing you have a large project, and don't necessarily want to hunt your hard-coded strings.

While Eclipse's "Externalize String" won't do all files in one go, if you go to context of your project (by right-clicking the project or your source directory), it should find all of your candidate classes. However, you'll still need to iterate through each file via a new window, but this at least gives you the list of files as verified with Kepler SR1.

We can use Java Code also.We need to pass the directory name as below 
and it will give the File name and matched Line which contains the Hard Code   
String ( " <Hard Code String in Double Quotes> " ) .

Directory/Path : c:\User\XYZ\src\

Logs Sample

Code :

                import java.io.BufferedReader;
                import java.io.File;
                import java.io.FileReader;
                import java.io.IOException;
                import java.util.List;
                import org.apache.commons.io.FileUtils;
                import org.apache.commons.io.filefilter.TrueFileFilter;
                import org.apache.log4j.Logger;

                public class ScanFiles {

                    private static final Logger logger = ScanFilesLogger.getLogger(ScanFiles.class);

                    private static void searchFiles(String folderPath, String searchString) throws IOException {
                        File folder = new File(folderPath);
                        List<File> files = (List<File>) FileUtils.listFiles(folder, TrueFileFilter.INSTANCE, TrueFileFilter.INSTANCE);
                        if (folder.isDirectory()) {
                             File[] fList = folder.listFiles();
                             for (File file : files) {
                                 if (!file.canRead()) {
                                    file.setReadable(true);
                                    }
                                    String content = "";
                                    try(BufferedReader br = new BufferedReader(new FileReader(file));) {
                                        StringBuilder sb = new StringBuilder();
                                        String line = br.readLine();
                                        logger.info("File :::::  " + file.getName());
                                        while ((line = br.readLine()) != null)
                                        {
                                        // Below condition we can omit in the search condition //
                                        if (line.contains(searchString) && (!line.contains("System.out.println") && !line.contains("logger.info") && !line.contains("Logger.info") && !line.contains("logger.debug") && !line.contains("Logger.debug") && !line.contains("logger.error") && !line.contains("Logger.error")  && !line.contains("Logger.info") && !line.contains("logger.debug") && !line.contains("Logger.debug") && !line.contains("logger.error") 
                                                     && !line.contains("LOGGER.debug")  && !line.contains("LOGGER.info")  && !line.contains("LOGGER.error") && !line.contains("assertTrue") && !line.contains("//") && !line.contains("/*")))
                                            {

                                                logger.info("Matched Line :::::"+line);
                                            }                           
                                        }
                                    } 
                            }
                        } else {
                            System.out.println("Not a Directory!");
                        }
                     }
                    public static void main(String args[]) throws IOException{

                        if(args.length == 0)            
                        {
                            logger.info(" ::::::::::  PATH cannot be empty ::::::::::");
                            System.exit(0);
                        }           
                            searchFiles(new File(args[0]).getAbsolutePath(),"\"");

                    }
                }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top