package railo.runtime.tag; import railo.commons.io.res.Resource; import railo.commons.io.res.util.ResourceUtil; import railo.commons.lang.StringUtil; import railo.runtime.exp.ApplicationException; import railo.runtime.exp.PageException; import railo.runtime.ext.tag.TagImpl; import railo.runtime.op.Caster; import railo.runtime.search.SearchCollection; import railo.runtime.search.SearchEngine; import railo.runtime.search.SearchException; /** * Allows you to create and administer Collections. **/ public final class Collection extends TagImpl { /** Specifies the action to perform. */ private String action="list"; /** */ private Resource path; /** Specifies a collection name or an alias if action = "map" */ private String collection; /** Name of the output variable (action=list) */ private String name; /** language of the collection (operators,stopwords) */ private String language="english"; //private boolean categories=false; @Override public void release() { super.release(); action="list"; path=null; collection=null; name=null; language="english"; //categories=false; } /** * @param categories the categories to set * @throws ApplicationException */ public void setCategories(boolean categories) { // Railo always support categories //this.categories = categories; } /** set the value action * Specifies the action to perform. * @param action value to set **/ public void setAction(String action) { if(action==null) return; this.action=action.toLowerCase().trim(); } public void setEngine(String engine) { // This setter only exists for compatibility reasions to other CFML engines, the attribute is completely ignored by Railo. } /** set the value path * * @param path value to set * @throws PageException **/ public void setPath(String strPath) throws PageException { if(strPath==null) return; this.path=ResourceUtil.toResourceNotExisting(pageContext,strPath.trim() ); //this.path=new File(path.toLowerCase().trim()); pageContext.getConfig().getSecurityManager().checkFileLocation(this.path); if(!this.path.exists()) { Resource parent=this.path.getParentResource(); if(parent!=null && parent.exists())this.path.mkdirs(); else { throw new ApplicationException("attribute path of the tag collection must be a existing directory"); } } else if(!this.path.isDirectory()) throw new ApplicationException("attribute path of the tag collection must be a existing directory"); } /** set the value collection * Specifies a collection name or an alias if action = "map" * @param collection value to set **/ public void setCollection(String collection) { if(collection==null) return; this.collection=collection.toLowerCase().trim(); } /** set the value name * * @param name value to set **/ public void setName(String name) { if(name==null) return; this.name=name.toLowerCase().trim(); } /** set the value language * * @param language value to set **/ public void setLanguage(String language) { if(language==null) return; this.language=validateLanguage(language); } public static String validateLanguage(String language) { if(StringUtil.isEmpty(language,true)) return "english"; language=language.toLowerCase().trim(); if("standard".equals(language)) return "english"; return language; } @Override public int doStartTag() throws PageException { //SerialNumber sn = pageContext.getConfig().getSerialNumber(); //if(sn.getVersion()==SerialNumber.VERSION_COMMUNITY) // throw new SecurityException("no access to this functionality with the "+sn.getStringVersion()+" version of railo"); try { if(action.equals("create")) doCreate(); else if(action.equals("repair")) doRepair(); else if(action.equals("delete")) doDelete(); else if(action.equals("optimize")) doOptimize(); else if(action.equals("list")) doList(); else if(action.equals("map")) doMap(); else if(action.equals("categorylist"))doCategoryList(); else throw new ApplicationException("Invalid value [" + action + "] for attribute action.", "allowed values are [create,repair,map,delete,optimize,list ]"); } catch (SearchException e) { throw Caster.toPageException(e); } return SKIP_BODY; } /** * @throws SearchException * @throws PageException * */ private void doMap() throws SearchException, PageException { required("collection",action,"collection",collection); required("collection",action,"path",path); getCollection().map(path); } /** * Creates a query in the PageContext containing all available Collections of the current searchStorage * @throws ApplicationException * @throws PageException * */ private void doList() throws ApplicationException, PageException { required("collection",action,"name",name); //if(StringUtil.isEmpty(name))throw new ApplicationException("for action list attribute name is required"); pageContext.setVariable(name,getSearchEngine().getCollectionsAsQuery()); } private void doCategoryList() throws PageException, SearchException { // check attributes required("collection",action,"collection",collection); required("collection",action,"name",name); pageContext.setVariable(name,getCollection().getCategoryInfo()); } /** * Optimizes the Collection * @throws SearchException * @throws PageException * */ private void doOptimize() throws SearchException, PageException { required("collection",action,"collection",collection); getCollection().optimize(); } /** * Deletes a Collection * @throws SearchException * @throws PageException * */ private void doDelete() throws SearchException, PageException { required("collection",action,"collection",collection); getCollection().delete(); } /** * * @throws SearchException * @throws PageException * */ private void doRepair() throws SearchException, PageException { required("collection",action,"collection",collection); getCollection().repair(); } /** * Creates a new collection * @throws SearchException * @throws PageException * */ private void doCreate() throws SearchException, PageException { required("collection",action,"collection",collection); required("collection",action,"path",path); getSearchEngine().createCollection(collection,path,language,SearchEngine.DENY_OVERWRITE); } /** * Returns the Searchstorage defined in the Environment * @return searchStorage */ private SearchEngine getSearchEngine() { return pageContext.getConfig().getSearchEngine(); } /** * the collection matching the collection name * @return collection * @throws SearchException */ private SearchCollection getCollection() throws SearchException { return getSearchEngine().getCollectionByName(collection); } @Override public int doEndTag() { return EVAL_PAGE; } }