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
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
28
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
84 User user = UserHelper.getCurrentUser(params, request, session);
85
86
87
88 Ivorn ivorn = (Ivorn) utils.getAnyParameterObject( SessionKeys.IVORN,params, request, session );
89 StoreClient storeClient = VoSpaceResolver.resolveStore(user, ivorn);
90
91
92
93
94
95
96
97
98
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
111
112 adqlAsXML = Sql2Adql.translateToAdql074( adqlAsString ) ;
113 logger.debug("[act] adqlAsXML (x): " + adqlAsXML);
114
115
116
117
118
119
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
168
169 }
170 catch( IOException myioex) {
171 session.setAttribute( SESSIONKEY_ADQL_ERROR, myioex.getLocalizedMessage() ) ;
172 }
173
174
175
176
177
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 }