My favorites | Sign in
Project Home Downloads Wiki Issues Source
Checkout   Browse   Changes    
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
package com.tgerm.tolerado.wsc.samples;

import java.beans.BeanInfo;
import java.beans.IntrospectionException;
import java.beans.Introspector;
import java.beans.PropertyDescriptor;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.Map;

import com.sforce.ws.ConnectionException;
import com.sforce.ws.ConnectorConfig;

/*
Copyright (c) 2010 tgerm.com
All rights reserved.

Redistribution and use in source and binary forms, with or without
modification, are permitted provided that the following conditions
are met:

1. Redistributions of source code must retain the above copyright
notice, this list of conditions and the following disclaimer.
2. Redistributions in binary form must reproduce the above copyright
notice, this list of conditions and the following disclaimer in the
documentation and/or other materials provided with the distribution.
3. The name of the author may not be used to endorse or promote products
derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*/

/**
* Wrapper over the WSC Connector
*
* @author abhinav
*/
public class WSCSession {
public static final String CLS_PARTNER_CONNECTOR = "com.sforce.soap.partner.Connector";
public static final String CLS_ENTERPRISE_CONNECTOR = "com.sforce.soap.enterprise.Connector";

public static enum LoginWSDL {
Enterprise, Partner
}

/**
* This map will give a performance boost by caching the loaded classes for
* once
*/
private static final Map<LoginWSDL, Class<?>> WSDL_CONNECTOR_CLASSES = new HashMap<LoginWSDL, Class<?>>();
static {
Class<?> connectorClass;
try {
connectorClass = Class.forName(CLS_ENTERPRISE_CONNECTOR);
WSDL_CONNECTOR_CLASSES.put(LoginWSDL.Enterprise, connectorClass);
} catch (Exception e) {
}
try {
connectorClass = Class.forName(CLS_PARTNER_CONNECTOR);
WSDL_CONNECTOR_CLASSES.put(LoginWSDL.Partner, connectorClass);
} catch (Exception e) {
}
}

private final ConnectorConfig config;
private String metadataServerUrl;
private String sessionId;

public WSCSession(LoginWSDL loginSource, String un, String pass)
throws ConnectionException {
// Load the Enterprise/Partner Connector class from Cache
Class<?> connectorClass = WSDL_CONNECTOR_CLASSES.get(loginSource);
if (connectorClass == null) {
throw new RuntimeException(
"Enterprise/Partner Connector classes not available in classpath.");
}

try {
Method newConnectionMethod = connectorClass.getMethod(
"newConnection", ConnectorConfig.class);
config = new ConnectorConfig();
config.setManualLogin(true);

Object connection = newConnectionMethod.invoke(null, config);
Method loginMethod = connection.getClass().getMethod("login",
String.class, String.class);
Object loginResult = loginMethod.invoke(connection, un, pass);
// Parses required information from login result
parseLoginResult(loginResult);
} catch (Exception e) {
throw new RuntimeException("Failed to Instantiate WSC Session", e);
}

}

private void parseLoginResult(Object loginResult)
throws IntrospectionException, IllegalAccessException,
InvocationTargetException {
BeanInfo info = Introspector.getBeanInfo(loginResult.getClass());
// All getMethods are called no args needed
for (PropertyDescriptor pd : info.getPropertyDescriptors()) {
String fieldName = pd.getName();
if ("metadataServerUrl".equals(fieldName)) {
metadataServerUrl = readPropertyValue(loginResult, pd);
} else if ("sessionId".equals(fieldName)) {
sessionId = readPropertyValue(loginResult, pd);
}
}
}

private String readPropertyValue(Object loginResult, PropertyDescriptor pd)
throws IllegalAccessException, InvocationTargetException {
Object[] args = null;
return (String) pd.getReadMethod().invoke(loginResult, args);
}

public String getSessionId() {
return sessionId;
}

public String getMetadataServerUrl() {
return metadataServerUrl;
}

public String getPartnerServerUrl() {
return metadataServerUrl.replaceAll("/m/", "/u/");
}

public String getEnterpriseServerUrl() {
return metadataServerUrl.replaceAll("/m/", "/c/");
}

public String getApexServerUrl() {
return metadataServerUrl.replaceAll("/m/", "/s/");
}

@Override
public String toString() {
return "WSCSessionFactory [metadataServerUrl=" + metadataServerUrl
+ ", sessionId=" + sessionId + "]";
}
}

Change log

r4 by abhinavgupta697 on Oct 27, 2010   Diff
[No log message]
Go to: 
Project members, sign in to write a code review

Older revisions

All revisions of this file

File info

Size: 5310 bytes, 152 lines
Powered by Google Project Hosting