[Title] Fixed out of memory problem
authorTaeyoung Son <taeyoung2.son@samsung.com>
Tue, 27 Aug 2013 12:41:14 +0000 (21:41 +0900)
committerTaeyoung Son <taeyoung2.son@samsung.com>
Wed, 28 Aug 2013 01:54:39 +0000 (10:54 +0900)
            - do not read all resources to memory
[Desc.]
[Issue]

Change-Id: I5200ef2a10a0d4495c80b07f90ab90bab84a7312

org.tizen.cli/src/org/tizen/cli/exec/web/build/Main.java

index f20656a..dd2118e 100755 (executable)
@@ -25,9 +25,7 @@
 package org.tizen.cli.exec.web.build;
 
 import java.io.File;
-import java.io.FileInputStream;
 import java.io.IOException;
-import java.io.InputStream;
 import java.text.MessageFormat;
 import java.util.ArrayList;
 import java.util.List;
@@ -53,7 +51,6 @@ import org.tizen.common.file.VirtualFileHandler;
 import org.tizen.common.file.filter.WildCardFilterFactory;
 import org.tizen.common.util.FileUtil;
 import org.tizen.common.util.FilenameUtil;
-import org.tizen.common.util.IOUtil;
 import org.tizen.web.builder.CssMinifyBuilder;
 import org.tizen.web.builder.HybridAppCLIBuilder;
 import org.tizen.web.builder.JSMinifyBuilder;
@@ -121,9 +118,6 @@ extends AbstractLauncher
     // excluding file list
     private List<String> excludes = new ArrayList<String>();
 
-    // set buildProcess's last layer
-    private ResourceLayer lastLayer;
-
     /**
      * Entry point for cli main
      * 
@@ -209,18 +203,18 @@ extends AbstractLauncher
         BuildProcess buildProcess = new BuildProcess();
 
         // Set start layer
-        ResourceLayer startLayer = new ResourceLayer(RESOURCE_LAYER_START, new VirtualFileHandler());
-        this.lastLayer = startLayer;
-
+        FileHandler fh = new StandardFileHandler();
+        fh.setCurrentWorkingDirectory(cwd);
+        ResourceLayer startLayer = new ResourceLayer(RESOURCE_LAYER_START, fh);
+        
         // Get resource list for build
-        Resource[] resources = getResources(cmdLine
-                                            , cwd
-                                            , startLayer
-                                            , null
-                                            , excludes.toArray(new String[excludes.size()]));
+        Resource[] resources = getBuildResources(cmdLine
+                                                , startLayer
+                                                , null
+                                                , excludes.toArray(new String[excludes.size()]));
 
         // Generate web builders to build process
-        generateBuilders(cmdLine, buildProcess, this.lastLayer);
+        generateAllBuilders(cmdLine, buildProcess, startLayer);
         if (buildProcess.getLastBuilder() != null) {
             logger.debug("start build process");
             try {
@@ -292,28 +286,36 @@ extends AbstractLauncher
      * @param parentLayer
      * @throws IOException
      */
-    public void generateBuilders(CommandLine cmdLine
+    public void generateAllBuilders(CommandLine cmdLine
                                             , BuildProcess buildProcess
                                             , ResourceLayer parentLayer) throws IOException {
-        lastLayer = parentLayer;
+
+        FileHandler fh = new VirtualFileHandler();
+        fh.setCurrentWorkingDirectory(parentLayer.getFileHandler().getCurrentWorkingDirectory());
 
         if (isExcludeUIFW(cmdLine)) {
-            addUIFWBuilder(true, cmdLine.hasOption(OPT_NAME_EXCLUDE_UI_FRAMEWORK_USEMIN), buildProcess, lastLayer);
+            addUIFWBuilder(true
+                            , cmdLine.hasOption(OPT_NAME_EXCLUDE_UI_FRAMEWORK_USEMIN)
+                            , buildProcess
+                            , getLastResourceLayer(buildProcess, parentLayer)
+                            , fh);
         }
 
         boolean hasReference = cmdLine.hasOption(OPT_NAME_REFERENCE_PROJECT);
         if (hasReference) {
-            lastLayer = getLastResourceLayer(buildProcess, lastLayer);
-            addHybridBuilder( cmdLine, buildProcess, lastLayer );
+            addHybridBuilder( cmdLine
+                                , buildProcess
+                                , getLastResourceLayer(buildProcess, parentLayer)
+                                , fh);
         }
 
         if (cmdLine.hasOption(OPT_NAME_OPTIMIZE)) {
-            lastLayer = getLastResourceLayer(buildProcess, lastLayer);
-            addOptimizingBuilders(buildProcess, lastLayer);
+            addOptimizingBuilders(buildProcess
+                                    , getLastResourceLayer(buildProcess, parentLayer)
+                                    , fh);
         }
 
-        lastLayer = getLastResourceLayer(buildProcess, lastLayer);
-        addLastbuilder(buildProcess, lastLayer);
+        addLastbuilder(buildProcess, getLastResourceLayer(buildProcess, parentLayer));
     }
 
     /**
@@ -337,10 +339,10 @@ extends AbstractLauncher
      * @param lastLayer
      * @throws IOException
      */
-    private void addHybridBuilder(CommandLine cmdLine, BuildProcess buildProcess, ResourceLayer lastLayer) throws IOException {
+    private void addHybridBuilder(CommandLine cmdLine, BuildProcess buildProcess, ResourceLayer lastLayer, FileHandler fh) throws IOException {
         ResourceLayer layer = new ResourceLayer(HybridAppCLIBuilder.RESOURCE_LAYER_NAME
                                                     , lastLayer
-                                                    , lastLayer.getFileHandler());
+                                                    , fh);
         
         String refPath = convertPath(cmdLine.getOptionValue(OPT_NAME_REFERENCE_PROJECT));
         
@@ -355,8 +357,8 @@ extends AbstractLauncher
      * @return
      */
     private ResourceLayer getLastResourceLayer(BuildProcess buildProcess, ResourceLayer defaultLayer) {
-        ResourceLayer parentLayer = buildProcess.getLastResourceLayer();
-        return (parentLayer != null) ? parentLayer : defaultLayer;
+        ResourceLayer lastLayer = buildProcess.getLastResourceLayer();
+        return (lastLayer != null) ? lastLayer : defaultLayer;
     }
 
     /**
@@ -370,10 +372,10 @@ extends AbstractLauncher
      * @param parentLayer
      */
     private void addUIFWBuilder(boolean isExclude, boolean useMin, BuildProcess buildProcess,
-            ResourceLayer parentLayer) {
+            ResourceLayer parentLayer, FileHandler fh) {
         ResourceLayer layer = new ResourceLayer(UIFWBuilder.RESOURCE_LAYER_NAME
                                                     , parentLayer
-                                                    , parentLayer.getFileHandler());
+                                                    , fh);
         UIFWBuilder uifwBuilder = new UIFWBuilder(isExclude, layer);
         uifwBuilder.setUseMin(useMin);
 
@@ -388,7 +390,7 @@ extends AbstractLauncher
     private void addLastbuilder(BuildProcess buildProcess, ResourceLayer parentLayer) {
         // add file output builder
         FileHandler fh = new StandardFileHandler();
-        fh.setCurrentWorkingDirectory(cwd);
+        fh.setCurrentWorkingDirectory(parentLayer.getFileHandler().getCurrentWorkingDirectory());
         ResourceLayer toFSLayer = new ResourceLayer(CopyBuilder.RESOURCE_LAYER_NAME
                                                         , parentLayer
                                                         , fh);
@@ -399,7 +401,6 @@ extends AbstractLauncher
     /**
      * Get resource list for build.
      * @param cmdLine
-     * @param input root path located resources. It means working path. means current path.
      * @param layer parent layer
      * @param includes Include resource list. If you want to add all resources located in input path, set this parameter to null.
      *                  If you set this parameter, another resources will not be added to list.
@@ -408,8 +409,7 @@ extends AbstractLauncher
      * @return
      * @throws IOException
      */
-    private Resource[] getResources(CommandLine cmdLine
-                                        , String input
+    private Resource[] getBuildResources(CommandLine cmdLine
                                         , ResourceLayer layer
                                         , String[] includes
                                         , String[] excludes) throws IOException {
@@ -417,40 +417,39 @@ extends AbstractLauncher
         setIncludes(includes);
         setExcludes(excludes);
 
-        addResources(input
-                        , FilenameUtil.getRelativePath(input, input)
-                        , layer
-                        , resources);
+        String cwd = layer.getFileHandler().getCurrentWorkingDirectory();
+        resources.addAll(getResources(cwd
+                                        , FilenameUtil.getRelativePath(cwd, cwd)
+                                        , layer));
 
         if (cmdLine.hasOption(OPT_NAME_REFERENCE_PROJECT)) {
+            FileHandler refFh = new StandardFileHandler();
             ResourceLayer referenceLayer = new ResourceLayer(HybridAppCLIBuilder.RESOURCE_LAYER_REFERENCE_NAME
-                                                                , layer
-                                                                , layer.getFileHandler());
+                                                                , refFh);
+            layer.setParent(referenceLayer);
             String refPath = convertPath(cmdLine.getOptionValue(OPT_NAME_REFERENCE_PROJECT));
+            refFh.setCurrentWorkingDirectory(refPath);
 
-            addResources(refPath
-                            , FilenameUtil.getRelativePath(refPath, refPath)
-                            , referenceLayer
-                            , resources);
-            lastLayer = referenceLayer;
+            resources.addAll(getResources(refPath
+                                            , FilenameUtil.getRelativePath(refPath, refPath)
+                                            , referenceLayer));
         }
 
         return resources.toArray(new Resource[resources.size()]);
     }
 
     /**
-     * Add resource for build
+     * get resource list
+     * @param cwd root path located resources. It means working path. means current path.
      * @param relativeSrcDir relative directory including resources.
-     * @param layer {@link ResourceLayer}
-     * @param resources output resources.
+     * @param layer {@link ResourceLayer} about resource
      * @throws IOException
      */
-    private void addResources(String cwd, String relativeSrcDir, ResourceLayer layer, List<Resource> resources) throws IOException {
+    private List<Resource> getResources(String cwd, String relativeSrcDir, ResourceLayer layer) throws IOException {
+        List<Resource> resources = new ArrayList<Resource>();
         List<File> files = null;
         String absoluteDir = cwd+ File.separator + relativeSrcDir;
         files = FileUtil.findFiles(new File(absoluteDir), ".*", true);
-        FileHandler fh = layer.getFileHandler();
-
 
         for (File file : files) {
             String fileRelativePath = FilenameUtil.getRelativePath(cwd, file.getCanonicalPath());
@@ -464,28 +463,9 @@ extends AbstractLauncher
             logger.debug("resource path : {}", fileRelativePath);
             Resource resource = new Resource(layer, fileRelativePath);
 
-            String dir = null;
-            if (file.isFile()) {
-                dir = FilenameUtil.removeTailingPath(fileRelativePath, 1);
-            } else {
-                dir = fileRelativePath;
-            }
-
-            logger.debug("directory : {}", dir);
-
-            if (!fh.is(dir, Attribute.EXISTS)) {
-                fh.makeDirectory(dir, true);
-            }
-
-            InputStream is = null;
-            try {
-                is = new FileInputStream(file);
-                resource.setContents(is);
-            } finally {
-                IOUtil.tryClose(is);
-            }
             resources.add(resource);
         }
+        return resources;
     }
 
     /**
@@ -519,7 +499,7 @@ extends AbstractLauncher
      * @param buildProcess
      * @param parentLayer
      */
-    private void addOptimizingBuilders(BuildProcess buildProcess, ResourceLayer parentLayer ) {
+    private void addOptimizingBuilders(BuildProcess buildProcess, ResourceLayer parentLayer, FileHandler fh) {
         if (buildProcess == null) {
             return;
         }
@@ -527,14 +507,14 @@ extends AbstractLauncher
         // add js minify builder
         ResourceLayer jsMinLayer = new ResourceLayer(JSMinifyBuilder.RESOURCE_LAYER_NAME
                                                         , parentLayer
-                                                        , parentLayer.getFileHandler());
+                                                        , fh);
         JSMinifyBuilder jsMin = new JSMinifyBuilder(jsMinLayer);
         buildProcess.addBuilder(jsMin);
         
         // add css minify builder
         ResourceLayer cssMinLayer = new ResourceLayer(CssMinifyBuilder.RESOURCE_LAYER_NAME
                                                         , jsMinLayer
-                                                        , jsMinLayer.getFileHandler());
+                                                        , fh);
         CssMinifyBuilder cssMin = new CssMinifyBuilder(cssMinLayer);
         buildProcess.addBuilder(cssMin);
     }