001    package railo.runtime.functions.rest;
002    
003    
004    import railo.commons.io.res.Resource;
005    import railo.commons.lang.StringUtil;
006    import railo.runtime.PageContext;
007    import railo.runtime.config.ConfigWebAdmin;
008    import railo.runtime.config.ConfigWebImpl;
009    import railo.runtime.exp.PageException;
010    import railo.runtime.op.Caster;
011    import railo.runtime.rest.Mapping;
012    import railo.runtime.rest.RestUtil;
013    
014    public class RestInitApplication {
015    
016            public static String call(PageContext pc , String dirPath) throws PageException {
017                    return _call(pc, dirPath, null,null,null);
018            }
019            
020            public static String call(PageContext pc , String dirPath, String serviceMapping) throws PageException {
021                    return _call(pc, dirPath, serviceMapping, null,null);
022            }
023    
024            public static String call(PageContext pc , String dirPath, String serviceMapping, boolean defaultMapping) throws PageException {
025                    return _call(pc, dirPath, serviceMapping, defaultMapping, null);
026            }
027    
028            public static String call(PageContext pc , String dirPath, String serviceMapping, boolean defaultMapping, String webAdminPassword) throws PageException {
029                    return _call(pc, dirPath, serviceMapping, defaultMapping, webAdminPassword);
030            }
031            
032            public static String _call(PageContext pc , String dirPath, String serviceMapping, Boolean defaultMapping, String webAdminPassword) throws PageException {
033                    if(StringUtil.isEmpty(serviceMapping,true)){
034                            serviceMapping=pc.getApplicationContext().getName();
035                    }
036                    Resource dir=RestDeleteApplication.toResource(pc,dirPath);
037                    
038                    ConfigWebImpl config=(ConfigWebImpl) pc.getConfig();
039                    Mapping[] mappings = config.getRestMappings();
040                    Mapping mapping;
041                    
042                    // id is mapping name
043                    
044                    String virtual=serviceMapping.trim();
045                    if(!virtual.startsWith("/")) virtual="/"+virtual;
046                    if(!virtual.endsWith("/")) virtual+="/";
047                    boolean hasResetted=false;
048                    for(int i=0;i<mappings.length;i++){
049                            mapping=mappings[i];
050                            if(mapping.getVirtualWithSlash().equals(virtual)){
051                                    // directory has changed
052                                    if(!RestUtil.isMatch(pc, mapping, dir) || (defaultMapping!=null && mapping.isDefault()!=defaultMapping.booleanValue())) {
053                                            update(pc,dir,virtual,RestDeleteApplication.getPassword(pc,webAdminPassword),defaultMapping==null?mapping.isDefault():defaultMapping.booleanValue());
054                                    }
055                                    mapping.reset(pc);
056                                    hasResetted=true;
057                            }
058                    }
059                    if(!hasResetted) {
060                            update(pc,dir,virtual,RestDeleteApplication.getPassword(pc,webAdminPassword),defaultMapping==null?false:defaultMapping.booleanValue());
061                    }
062            
063                    return null;
064            }
065    
066            private static void update(PageContext pc,Resource dir, String virtual, String webAdminPassword, boolean defaultMapping) throws PageException {
067                    try {
068                            ConfigWebAdmin admin = ConfigWebAdmin.newInstance((ConfigWebImpl)pc.getConfig(),webAdminPassword);
069                            admin.updateRestMapping(virtual, dir.getAbsolutePath(), defaultMapping);
070                            admin.store();
071                    } 
072                    catch (Exception e) {
073                            throw Caster.toPageException(e);
074                    }
075            }
076            
077    }