View Javadoc

1   package org.astrogrid.portal.datacenter.acting;
2   
3   import java.util.HashMap;
4   import java.util.Map;  
5   import java.io.IOException;  
6   
7   import org.apache.avalon.framework.logger.Logger;
8   import org.apache.avalon.framework.parameters.Parameters;
9   import org.apache.cocoon.acting.AbstractAction;
10  import org.apache.cocoon.environment.ObjectModelHelper;
11  import org.apache.cocoon.environment.Redirector;
12  import org.apache.cocoon.environment.Request;
13  import org.apache.cocoon.environment.Session;
14  import org.apache.cocoon.environment.SourceResolver;
15  import org.astrogrid.community.User;
16  import org.astrogrid.portal.common.user.UserHelper;
17  //bug 609 - JBL
18  import org.astrogrid.portal.login.common.SessionKeys;
19  import org.astrogrid.store.delegate.VoSpaceResolver;
20  
21  import org.astrogrid.portal.utils.acting.ActionUtils;
22  import org.astrogrid.portal.utils.acting.ActionUtilsFactory;
23  import org.astrogrid.store.Agsl;
24  import org.astrogrid.store.Ivorn;
25  import org.astrogrid.store.delegate.StoreClient; 
26  import org.astrogrid.store.delegate.StoreDelegateFactory; 
27  //bug 566 --clq2
28  //import org.astrogrid.datacenter.sqlparser.Sql2Adql074;
29  import org.astrogrid.datacenter.query.Sql2Adql;
30  
31  import org.apache.avalon.framework.logger.ConsoleLogger;
32  
33  /***
34   * This class provides the DataCenter UI with the facility to
35   * save a given MySpace named ADQL file from the Query Builder.
36   * 
37   * @author peter.shillan <mailto:gps@roe.ac.uk />
38   */
39  public class MySpaceSaveAction extends AbstractAction {
40      
41      /***
42       * Switch for our debug statements. 
43       *  
44       */
45      private static final boolean DEBUG_TO_SYSTEM_OUT = true;
46       
47      public static final String SESSIONKEY_ADQL_AS_STRING = "adqlQuery" ;
48      
49      public static final String SESSIONKEY_RESOURCE_ID = "uniqueID" ;
50      
51      public static final String SESSIONKEY_ADQL_ERROR = "query-builder-adql-error" ;
52       
53    /***
54     * Save the required ADQL document to MySpace.
55     * 
56     * <p> 
57     *   SiteMap Outputs:
58     *     <ol>
59     *       <li><code>adql-document-saved</code>: "true" if ADQL was successfully saved</li>
60     *     </ol>
61     * </p>
62     * <p>
63     *   Request Attribute Outputs:
64     *     <ol>
65     *       <li><code>adql-document-saved</code>: "true" if ADQL was successfully saved</li>
66     *       <li><code>adql-document-error-message</code>: ADQL save error message</li>
67     *     </ol>
68     * </p>
69     * 
70     * @see org.apache.cocoon.acting.Action#act(org.apache.cocoon.environment.Redirector, org.apache.cocoon.environment.SourceResolver, java.util.Map, java.lang.String, org.apache.avalon.framework.parameters.Parameters)
71     */
72    public Map act(Redirector redirector, SourceResolver resolver, Map objectModel, String source, Parameters params) {
73      Logger logger = this.retrieveLogger();
74      
75      Map sitemapParams = new HashMap();
76      ActionUtils utils = ActionUtilsFactory.getActionUtils();
77  
78      Request request = ObjectModelHelper.getRequest(objectModel);
79      Session session = request.getSession(true);
80      
81      try {
82          
83        // Set the current user.
84        User user = UserHelper.getCurrentUser(params, request, session);
85  
86  // Bug 609 - JBL...    
87        // Get the store client from the VOSpaceResolver.
88        Ivorn ivorn = (Ivorn) utils.getAnyParameterObject( SessionKeys.IVORN,params, request, session );
89        StoreClient storeClient = VoSpaceResolver.resolveStore(user, ivorn);
90        
91  //      // Set MySpace end point.
92  //      String endPoint = utils.getAnyParameter( "myspace-end-point", params, request, session );
93  //      
94  //      // Set base AstroGrid storage location.
95  //      Agsl agsl = new Agsl(endPoint);
96  //      
97  //      // Get the storage client.
98  //      StoreClient storeClient = StoreDelegateFactory.createDelegate(user, agsl);
99        
100       StringBuffer buffer = new StringBuffer( 512 ) ;
101       String adqlAsXML ;
102       String adqlAsString = utils.getAnyParameter(SESSIONKEY_ADQL_AS_STRING, params, request, session);
103       session.setAttribute( SESSIONKEY_ADQL_AS_STRING, adqlAsString ) ; 
104       session.removeAttribute( SESSIONKEY_ADQL_ERROR ) ;
105       Object resourceId = session.getAttribute( SESSIONKEY_RESOURCE_ID ) ;  
106       logger.debug("[act] adqlAsString (s): " + adqlAsString);
107       
108       try {
109 
110           //bug 566 -clq2
111           //adqlAsXML = Sql2Adql074.translate( adqlAsString ) ;
112 		  adqlAsXML =  Sql2Adql.translateToAdql074( adqlAsString ) ;
113           logger.debug("[act] adqlAsXML (x): " + adqlAsXML);
114       
115           // JL. This is a hack. 
116           // The parser seems not to be supplying the xml "header";
117           // ie: the xml Processing Instruction.
118           // So, if it's not there, we supply it. 
119           // I'm also raising a bug on the parser. 
120           if( adqlAsXML.indexOf( "<?xml" ) < 0 ) {
121               buffer
122                 .append( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" ) 
123                 .append( "<?qb-sql-source " )
124                 .append( adqlAsString )
125                 .append( " ?>" )
126                 .append( "<?qb-registry-resources " )
127                 .append( resourceId != null ? (String)resourceId : "none" )
128                 .append( " ?>" ) 
129                 .append( adqlAsXML ) ;
130           }
131           else {
132               buffer
133                 .append( adqlAsXML.substring( 0, adqlAsXML.indexOf( "?>" ) + 2 ) ) 
134                 .append( "<?qb-sql-source " )
135                 .append( adqlAsString )
136                 .append( " ?>" )
137                 .append( "<?qb-registry-resources " )
138                 .append( resourceId != null ? (String)resourceId : "none" )
139                 .append( " ?>" ) 
140                 .append( adqlAsXML.substring( adqlAsXML.indexOf( "?>" ) + 2 ) ) ;
141           }
142             
143           session.removeAttribute( SESSIONKEY_ADQL_ERROR ) ;
144   
145       }
146       catch ( Exception ex ) {
147           
148           buffer
149             .append( "<?xml version=\"1.0\" encoding=\"UTF-8\"?>" )
150             .append( "<?qb-sql-source " )
151             .append( adqlAsString )
152             .append( " ?>" )        
153             .append( "<?qb-registry-resources " )
154             .append( resourceId != null ? (String)resourceId : "none" )
155             .append( " ?>" ) ;
156                            
157           session.setAttribute( SESSIONKEY_ADQL_ERROR, ex.getLocalizedMessage() ) ;
158           logger.debug("[act] adql error: " + ex.getLocalizedMessage() ) ;
159                   
160       }
161 
162       String mySpaceName = utils.getAnyParameter("myspace-name", params, request, session);
163       logger.debug("[act] mySpaceName: " + mySpaceName);
164 
165       logger.debug( "[act] adql final format: " + buffer.toString() ) ;
166       storeClient.putString( buffer.toString(), mySpaceName, false );
167 //      request.setAttribute("adql-document-saved", "true");
168 //      sitemapParams.put("adql-document-saved", "true");
169     }
170 		catch( IOException myioex) {
171             session.setAttribute( SESSIONKEY_ADQL_ERROR, myioex.getLocalizedMessage() ) ;
172 		}
173         
174 //        catch(Throwable t) {
175 //            request.setAttribute("adql-document-saved", "false");
176 //            request.setAttribute("adql-document-error-message", t.getLocalizedMessage());
177 //            sitemapParams = null;
178 //        }
179       
180     return sitemapParams;
181   }
182   
183   
184   /***
185    * During unit tests the logger isn't setup properly, hence this method to
186    * use a console logger instead.  Also will log to console
187    * if debugToSystemOutOn - can be useful.
188    *  
189    */
190   private Logger retrieveLogger() {
191       Logger logger = super.getLogger();
192       if (logger == null || DEBUG_TO_SYSTEM_OUT) {
193           enableLogging(new ConsoleLogger());
194           logger = super.getLogger();
195       }
196       return logger ;
197   }  
198   
199   
200 }