001: /*
002: * Copyright (C) 2001, 2002 Robert MacGrogan
003: *
004: * This library is free software; you can redistribute it and/or
005: * modify it under the terms of the GNU Lesser General Public
006: * License as published by the Free Software Foundation; either
007: * version 2.1 of the License, or (at your option) any later version.
008: *
009: * This library is distributed in the hope that it will be useful,
010: * but WITHOUT ANY WARRANTY; without even the implied warranty of
011: * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
012: * Lesser General Public License for more details.
013: *
014: * You should have received a copy of the GNU Lesser General Public
015: * License along with this library; if not, write to the Free Software
016: * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
017: *
018: *
019: * $Archive: SourceJammer$
020: * $FileName: SOAPPortal.java$
021: * $FileID: 3959$
022: *
023: * Last change:
024: * $AuthorName: Rob MacGrogan$
025: * $Date: 7/18/03 6:57 PM$
026: * $Comment: New improved SOAP error messages.$
027: */
028:
029: package org.sourcejammer.client;
030:
031: /**
032: * Title: $FileName: SOAPPortal.java$<br>
033: * @author $AuthorName: Rob MacGrogan$<br>
034: * @version $VerNum: 10$<br><br>
035: *
036: * $Description: $<br>
037: * $KeyWordsOff: $
038: */
039: import org.sourcejammer.project.view.*;
040: import org.sourcejammer.util.ConfigurationException;
041: import java.io.*;
042: import java.security.Provider;
043: import java.util.*;
044: import java.net.*;
045:
046: import org.w3c.dom.*;
047: import org.apache.soap.util.xml.*;
048: import org.apache.soap.*;
049: import org.apache.soap.transport.*;
050: import org.apache.soap.transport.http.*;
051: import org.sourcejammer.client.gui.CommandCentral;
052: import org.sourcejammer.client.gui.conf.UserPrefs;
053: import org.apache.soap.encoding.*;
054: import org.apache.soap.encoding.soapenc.*;
055: import org.apache.soap.rpc.*;
056: import org.sourcejammer.util.SJDate;
057: import org.sourcejammer.util.SourceJammerConnectionException;
058: import org.sourcejammer.project.controller.LabelVersionMappingBean;
059: import org.sourcejammer.project.view.ViewLabel;
060: import org.sourcejammer.project.view.DownloadFileIdentifier;
061:
062: public class SOAPPortal {
063:
064: public static final class MCPMethodNames {
065: public static final String ADD_ARCHIVE = "addArchive";
066: public static final String ADD_FILE = "addFile";
067: public static final String ADD_PROJECT = "addProject";
068: public static final String ADD_USER = "addUser";
069: public static final String CHECK_IN_FILE = "checkInFile";
070: public static final String CHECK_OUT_FILE = "checkOutFile";
071: public static final String CONNECT = "connect";
072: public static final String DISCONNECT = "disconnect";
073: public static final String GET_FILE_INFO = "getFileInfo";
074: public static final String GET_FILE_LATEST_VERSION = "getFileLatestVersion";
075: public static final String GET_FILE_VERSION = "getFileVersion";
076: public static final String GET_PROJECT_INFO = "getProjectInfo";
077: public static final String PERMANENTLY_DELETE_NODE = "permanentlyDeleteNode";
078: public static final String REMOVE = "remove";
079: public static final String REMOVE_FILE = "removeFile";
080: public static final String REMOVE_PROJECT = "removeProject";
081: public static final String RESTORE_REMOVED_NODE = "restoreRemovedNode";
082: public static final String ROLLBACK_TO_VERSION = "rollBackToVersions";
083: public static final String UNDO_CHECKOUT = "undoCheckOut";
084: public static final String VIEW_REMOVED_NODES = "viewRemovedNodes";
085: public static final String VIEW_VERSION_COMMENT = "viewVersionComment";
086: public static final String LOG_IN = "login";
087: public static final String CHANGE_PASSWORD = "changePassword";
088: public static final String MAKE_LABEL = "makeLabeledVersion";
089: public static final String GET_LABEL = "getLabelContentList";
090: public static final String LABEL_LIST = "getLabelList";
091: public static final String GET_UNIQUE_ID_FROM_PATH = "getUniqueIDFromPath";
092: public static final String GET_LATEST_VERSION_ID = "getFileLatestVersionID";
093: public static final String RENAME_PROJECT = "renameProject";
094: public static final String RENAME_FILE = "renameFile";
095:
096: //new for 1.2
097: public static final String ADD_USER_TO_ARCHIVE_CONTROLLERS = "addToArchiveControllerUsers";
098: public static final String ADD_USER_TO_ARCHIVE_USERS = "addToArchiveUsers";
099: public static final String GET_ARCHIVE_USER_LIST = "getArchiveUserList";
100: public static final String GET_COMPLETE_USER_LIST = "getCompleteUserList";
101: public static final String GET_CONTROLLER_USER_LIST = "getControllerUserList";
102: public static final String REMOVE_USER_FROM_ARCHIVE_CONTROLLERS = "removeFromArchiveControllerUsers";
103: public static final String REMOVE_USER_FROM_ARCHIVE_USERS = "removeFromArchiveUsers";
104: public static final String SET_USER_ADMIN_STATUS = "setUserAdmin";
105: public static final String REMOVE_USER = "removeUser";
106: public static final String DELETE_ARCHIVE = "deleteArchive";
107: public static final String GET_ARCHIVE_NAMES = "getArchiveNames";
108:
109: //New for 1.3
110: public static final String MOVE_FILE = "moveFile";
111: public static final String COPY_FILE = "copyFile";
112: public static final String COPY_PROJECT = "copyProject";
113: public static final String MOVE_PROJECT = "moveProject";
114: public static final String REBUILD_LABEL = "rebuildLabel";
115: public static final String GET_ARCHIVE_PROPS = "getArchiveProperties";
116: public static final String SET_ARCHIVE_PROPS = "setArchiveProperties";
117:
118: //New for 2.0
119: public static final String CHANGE_FILE_DESCRIPTION = "changeFileDescription";
120: public static final String GET_CHANGE_LIST = "getChangeList";
121:
122: //New for 2.1
123: public static final String SHARE_FILE = "shareFile";
124: public static final String SHARE_PROJECT = "shareProject";
125: public static final String REMOVE_FILE_SHARE = "removeFileShare";
126: public static final String REMOVE_PROJECT_SHARE = "removeProjectShare";
127: public static final String BRANCH_FILE = "branchFile";
128: public static final String BRANCH_PROJECT = "branchProject";
129: public static final String PROJECT_CONTAINS_SHARES = "doesProjectContainShares";
130: public static final String CHECK_DELETED_NODE_SHARE_STATUS = "checkDeletedNodeShareStatus";
131: public static final String FIRE_SERVER_PLUGIN = "firePluginAction";
132: public static final String GET_BRANCH_REPORT = "getFileBranchReport";
133: }
134:
135: private static String providerName = null;
136: private SOAPMappingRegistry moRegistry = null;
137: private BeanSerializer oSerializer = new BeanSerializer();
138: private URL mUrl = null;
139: private static String proxyPassword = null;
140:
141: public SOAPPortal() {
142:
143: //set mapping registry used by all calls to this object.
144: moRegistry = new SOAPMappingRegistry();
145:
146: moRegistry.mapTypes(Constants.NS_URI_SOAP_ENC,
147: new QName("urn:sj-mastercontrolprogram",
148: "downloadfileidentifier"),
149: DownloadFileIdentifier.class, oSerializer, oSerializer);
150: moRegistry.mapTypes(Constants.NS_URI_SOAP_ENC, new QName(
151: "urn:sj-mastercontrolprogram", "fileproperties"),
152: FileProperties.class, oSerializer, oSerializer);
153: moRegistry.mapTypes(Constants.NS_URI_SOAP_ENC, new QName(
154: "urn:sj-mastercontrolprogram", "userinfo"),
155: UserInfo.class, oSerializer, oSerializer);
156: moRegistry.mapTypes(Constants.NS_URI_SOAP_ENC, new QName(
157: "urn:sj-mastercontrolprogram", "request"),
158: SJRequest.class, oSerializer, oSerializer);
159: moRegistry.mapTypes(Constants.NS_URI_SOAP_ENC, new QName(
160: "urn:sj-mastercontrolprogram", "response"),
161: SJResponse.class, oSerializer, oSerializer);
162: moRegistry.mapTypes(Constants.NS_URI_SOAP_ENC, new QName(
163: "urn:sj-mastercontrolprogram", "file"),
164: org.sourcejammer.project.view.File.class, oSerializer,
165: oSerializer);
166: moRegistry.mapTypes(Constants.NS_URI_SOAP_ENC, new QName(
167: "urn:sj-mastercontrolprogram", "Project"),
168: Project.class, oSerializer, oSerializer);
169: moRegistry.mapTypes(Constants.NS_URI_SOAP_ENC, new QName(
170: "urn:sj-mastercontrolprogram", "nodeinfo"),
171: NodeInfo.class, oSerializer, oSerializer);
172: moRegistry.mapTypes(Constants.NS_URI_SOAP_ENC, new QName(
173: "urn:sj-mastercontrolprogram", "nodename"),
174: NodeName.class, oSerializer, oSerializer);
175: moRegistry.mapTypes(Constants.NS_URI_SOAP_ENC, new QName(
176: "urn:sj-mastercontrolprogram", "sjdate"), SJDate.class,
177: oSerializer, oSerializer);
178: moRegistry
179: .mapTypes(Constants.NS_URI_SOAP_ENC, new QName(
180: "urn:sj-mastercontrolprogram",
181: "labelversionmappingbean"),
182: LabelVersionMappingBean.class, oSerializer,
183: oSerializer);
184: moRegistry.mapTypes(Constants.NS_URI_SOAP_ENC, new QName(
185: "urn:sj-mastercontrolprogram", "viewlabel"),
186: ViewLabel.class, oSerializer, oSerializer);
187: moRegistry.mapTypes(Constants.NS_URI_SOAP_ENC, new QName(
188: "urn:sj-mastercontrolprogram", "archiveproperties"),
189: org.sourcejammer.project.view.ArchiveProperties.class,
190: oSerializer, oSerializer);
191: }
192:
193: /**
194: * Maps the class to the namespace and part, which must be specified
195: * on the server among the Deployed Services. See Apache SOAP docs
196: * for more details.
197: */
198: public void mapType(String nameSpaceURI, String part, Class javaType) {
199: moRegistry
200: .mapTypes(Constants.NS_URI_SOAP_ENC, new QName(
201: nameSpaceURI, part), javaType, oSerializer,
202: oSerializer);
203: }
204:
205: public void setURL(String s) throws MalformedURLException {
206: URL u = new URL(s);
207: setURL(u);
208: }
209:
210: public void setURL(URL url) {
211: mUrl = url;
212: if (providerName != null) {
213: java.security.Security.removeProvider(providerName);
214: }
215:
216: if (mUrl.getProtocol().equalsIgnoreCase("https")) {
217: //ssl.
218: System.setProperty("javax.net.ssl.trustStore",
219: SourceJammerClient.getInstance().getKeyStoreFile());
220: System.setProperty("java.protocol.handler.pkgs",
221: "com.sun.net.ssl.internal.www.protocol");
222: Provider p = new com.sun.net.ssl.internal.ssl.Provider();
223: providerName = p.getName();
224: java.security.Security.addProvider(p);
225: } else {
226: providerName = null;
227: }
228: }
229:
230: public void setProxyPassword(String s) {
231: proxyPassword = s;
232: }
233:
234: public static String getProxyPassword() {
235: return proxyPassword;
236: }
237:
238: public SJResponse sendRequest(SJRequest request, String sMethod)
239: throws SourceJammerConnectionException, NoSessionException {
240:
241: if (mUrl == null) {
242: throw new ConfigurationException(
243: "URL property must be set before a request can be sent.");
244: }
245: // Build the call.
246: Call call = new Call();
247:
248: // Add Proxy settings for SOAP Handler
249: UserPrefs prefs = UserPrefs.getInstance();
250: boolean proxyEnabled = prefs.getBoolean(
251: UserPrefs.PROXY_ENABLED, false);
252: if (proxyEnabled) {
253: String host = prefs.getString(UserPrefs.PROXY_HOST, "x");
254: int port = Integer.parseInt(prefs.getString(
255: UserPrefs.PROXY_PORT, "8080"));
256:
257: SOAPHTTPConnection transport = new SOAPHTTPConnection();
258: transport.setProxyHost(host);
259: transport.setProxyPort(port);
260:
261: if (prefs.getBoolean(UserPrefs.PROXY_USE_PASSWORD, false)) {
262: String user = prefs.getString(UserPrefs.PROXY_USER, "");
263: transport.setProxyUserName(user);
264: transport.setProxyPassword(proxyPassword);
265: }
266:
267: call.setSOAPTransport(transport);
268: //System.out.println("Proxy wurde gesezt...");
269: }
270:
271: call.setSOAPMappingRegistry(moRegistry);
272: call.setTargetObjectURI("urn:MasterControlProgram");
273: call.setMethodName(sMethod);
274: call.setEncodingStyleURI(Constants.NS_URI_SOAP_ENC);
275:
276: Vector params = new Vector();
277:
278: params.addElement(new Parameter("request", SJRequest.class,
279: request, null));
280: call.setParams(params);
281:
282: // Invoke the call.
283: Response resp;
284:
285: try {
286: resp = call.invoke(mUrl, "");
287: } catch (SOAPException ex) {
288: String fault = ex.getFaultCode();
289: //System.out.println("Fault code: " + fault);
290: //if (fault.equals(org.apache.soap.Constants.FAULT_CODE_CLIENT)){
291: //System.out.println("CLIENT");
292: //}
293: //else if (fault.equals(org.apache.soap.Constants.FAULT_CODE_MUST_UNDERSTAND)){
294: //System.out.println("MUST UNDERSTAND");
295: //}
296: //else if (fault.equals(org.apache.soap.Constants.FAULT_CODE_PROTOCOL)){
297: //System.out.println("PROTOCOL");
298: //}
299: //else if (fault.equals(org.apache.soap.Constants.FAULT_CODE_SERVER)){
300: //System.out.println("SERVER");
301: //}
302: //else if (fault.equals(org.apache.soap.Constants.FAULT_CODE_SERVER_BAD_TARGET_OBJECT_URI)){
303: //System.out.println("BAD TARGET OBJECT URI");
304: //}
305: //else if (fault.equals(org.apache.soap.Constants.FAULT_CODE_VERSION_MISMATCH)){
306: //System.out.println("VERSION MISMATCH");
307: //}
308: String msg = null;
309: if (fault.equals(Constants.FAULT_CODE_PROTOCOL)) {
310: msg = DisplayTextLibrary
311: .displayText(DisplayTextLibrary.ERR_NOT_SOAP);
312: }
313: if (msg == null) {
314: throw new SourceJammerConnectionException(
315: DisplayTextLibrary
316: .displayText(DisplayTextLibrary.ERR_SOAP_PROBLEM),
317: ex);
318: } else {
319: throw new SourceJammerConnectionException(msg);
320: }
321: }
322: SJResponse response = null;
323: // Check the response.
324: if (!resp.generatedFault()) {
325: Parameter ret = resp.getReturnValue();
326: response = (SJResponse) ret.getValue();
327: } else {
328: Fault fault = resp.getFault();
329: StringBuffer strException = new StringBuffer();
330: strException.append("A fault was generated:\r\n").append(
331: " Fault Code = ").append(fault.getFaultCode())
332: .append("\r\n").append(" Fault String = ").append(
333: fault.getFaultString());
334: throw new SourceJammerConnectionException(strException
335: .toString());
336: }
337:
338: //Throw no session if no session id found and this is not a disconnect.
339: if (!response.getErrorEncountered()
340: && response.getSessionID() < 0
341: && !sMethod.equals(MCPMethodNames.DISCONNECT)) {
342: throw new NoSessionException(
343: "No valid session id found in response.");
344: }
345: return response;
346: }
347:
348: public static void main(String[] args) {
349: try {
350: Properties props = System.getProperties();
351: Enumeration enm = props.keys();
352: while (enm.hasMoreElements()) {
353: String key = (String) enm.nextElement();
354: String val = System.getProperty(key);
355: System.out.println(key + ":" + val);
356: }
357: } catch (Throwable thr) {
358: thr.printStackTrace();
359: }
360: }
361:
362: }
|