com.perforce.p4java.impl.mapbased.rpc
Class RpcServer

java.lang.Object
  extended by com.perforce.p4java.impl.mapbased.server.Server
      extended by com.perforce.p4java.impl.mapbased.rpc.RpcServer
All Implemented Interfaces:
IServerControl, IOptionsServer, IServer
Direct Known Subclasses:
NtsServerImpl, OneShotServerImpl

public abstract class RpcServer
extends Server

RPC-based Perforce server implementation superclass.


Field Summary
protected  int clientApiLevel
           
protected  long connectionStart
           
static int DEFAULT_CLIENT_API_LEVEL
          Default Perforce client API level; 68 represents 2010.2 capabilities.
static String DEFAULT_PROG_NAME
          The default string sent to the Perforce server in the protocol command defining the client's program name.
static String DEFAULT_PROG_VERSION
          The default string sent to the Perforce server in the protocol command defining the client's program version.
static int DEFAULT_SERVER_API_LEVEL
          Default Perforce server API level; 99999 apparently means "whatever...".
static IServerImplMetadata.ImplType IMPL_TYPE
          The implementation type of this implementation.
protected  String localHostName
           
protected  boolean relaxCmdNameValidationChecks
          If true, relax the command name validation checks done in the RPC layer.
static String RPC_ENV_CWD_KEY
          The system properties key for the JVM's current directory.
static String RPC_ENV_NOCLIENT_SPEC
          What we use in the RPC environment packet to signal to the Perforce server that we don't have a client set yet or don't know what it is.
static String RPC_ENV_NOHOST_SPEC
          What we use in the RPC environment packet to signal to the Perforce server that we don't have a hostname set yet or don't know what it is.
static String RPC_ENV_NOUSER_SPEC
          What we use in the RPC environment packet to signal to the Perforce server that we don't have a client set yet or don't know what it is.
static String RPC_ENV_OS_NAME_KEY
          The system properties key for the OS name.
static String RPC_ENV_UNIX_SPEC
          What we use in the RPC environment packet to signal to the Perforce server that we're a NON-Windows box.
static String RPC_ENV_WINDOWS_PREFIX
          RPC_ENV_OS_NAME_KEY property value prefix for Windows systems.
static String RPC_ENV_WINDOWS_SPEC
          What we use in the RPC environment packet to signal to the Perforce server that we're a Windows box.
static boolean RPC_TAGS_USED
          Signifies whether or not we use tagged output.
static String RPC_TMP_CONVERTER_KEY
          Use to key converter to use out of state map
static String RPC_TMP_OUTFILE_STREAM_KEY
          Used to key temporary output streams in the command environment's state map for things like getFileContents(), etc., using the execStreamCmd method(s).
protected  String secretKey
           
protected  int serverApiLevel
           
protected  String serverId
           
protected  Map<String,Object> serverProtocolMap
           
protected  ServerStats serverStats
           
static String TRACE_PREFIX
          What we use as a P4JTracer trace prefix for methods here.
 
Fields inherited from class com.perforce.p4java.impl.mapbased.server.Server
ATTRIBUTE_STREAM_MAP_KEY, authTicket, caseSensitive, charset, charsetName, client, clientName, clientUnsetName, commandCallback, connected, CORE_AUTH_FAIL_STRING_1, CORE_AUTH_FAIL_STRING_2, CORE_AUTH_FAIL_STRING_3, CORE_AUTH_FAIL_STRING_4, DEFAULT_STATUS_FIELD_NAME, IMPL_COMMENTS_FIELD_NAME, IMPL_TYPE_FIELD_NAME, isRunningOnWindows, loginOnConnect, MINIMUM_SUPPORTED_SERVER_LEVEL_FIELD_NAME, minumumSupportedServerVersion, nextCmdCallBackKey, nextProgressCallbackKey, nonCheckedSyncs, P4TICKETS_DEFAULT_OTHER, P4TICKETS_DEFAULT_WINDOWS, P4TICKETS_ENV_VAR, password, progressCallback, props, PROTOCOL_NAME_FIELD_NAME, SCREEN_NAME_FIELD_NAME, serverHost, serverPort, serverVersion, setupOnConnect, ssoCallback, ssoKey, status, tmpDirName, UNKNOWN_SERVER_HOST, UNKNOWN_SERVER_PORT, UNKNOWN_SERVER_VERSION, usageOptions, userName
 
Constructor Summary
RpcServer()
           
 
Method Summary
 void connect()
          Try to establish an actual RPC connection to the target Perforce server.
 void disconnect()
          Try to cleanly disconnect from the Perforce server at the other end of the current connection (with the emphasis on "cleanly").
 int getClientApiLevel()
           
protected  String getClientNameForEnv()
           
 String getErrorOrInfoStr(Map<String,Object> map)
           
 String getErrorStr(Map<String,Object> map)
          RPC impl errors come across the wire as a map in the form usually like this:
protected  int getGenericCode(Map<String,Object> map)
           
protected  String getHostForEnv()
           
 String getInfoStr(Map<String,Object> map)
           
protected  String getLanguageForEnv()
           
protected  String getOsTypeForEnv()
           
 PerformanceMonitor getPerfMonitor()
           
 String getSecretKey()
           
 String getServerId()
          Get the server's id field used for storing authentication tickets.
 int getSeverityCode(Map<String,Object> map)
           
protected  String getUserForEnv()
           
 ServerStatus init(String host, int port, Properties props)
          The default init sets up things like host names, etc., and fails if we can't establish some pretty basic things at connect time.
 ServerStatus init(String host, int port, Properties props, UsageOptions opts)
          Initialize the server.
 boolean isAuthFail(String errStr)
           
 boolean isInfoMessage(Map<String,Object> map)
           
protected  boolean isRelaxCmdNameValidationChecks()
           
 String loadTicket(String serverId)
          Get the p4tickets entry value for the current user returned from Server.getUserName() and server address based upon a search of either the file found at PropertyDefs.TICKET_PATH_KEY_SHORT_FORM, PropertyDefs.TICKET_PATH_KEY, the P4TICKETS environment variable or the standard p4tickets file location for the current OS.
protected  void processCmdCallbacks(int cmdCallBackKey, long timeTaken, Map<String,Object>[] retMap)
           
 void saveCurrentTicket()
          Save current ticket returned from Server.getAuthTicket().
 void saveTicket(String ticketValue)
          Save specified auth ticket value as associate with this server's address and configured user returned from Server.getUserName().
 void setClientApiLevel(int clientApiLevel)
           
 void setPerfMonitor(PerformanceMonitor perfMonitor)
           
protected  void setRelaxCmdNameValidationChecks(boolean relaxCmdNameValidationChecks)
           
 void setSecretKey(String secretKey)
           
 void setServerId(String serverId)
          Set the server's id field used for storing authentication tickets.
 boolean supportsSmartMove()
          Return true IFF the underlying Perforce server supports the new 2009.1 and later "smart move" command.
protected  boolean writeInPlace(String cmdName)
          Return true iff we should be performing server -> client file write I/O operations in place for this command.
 
Methods inherited from class com.perforce.p4java.impl.mapbased.server.Server
createBranchSpec, createClient, createDepot, createJob, createLabel, createUser, createUser, createUserGroup, createUserGroup, deleteBranchSpec, deleteBranchSpec, deleteClient, deleteClient, deleteCounter, deleteDepot, deleteJob, deleteLabel, deleteLabel, deletePendingChangelist, deleteUser, deleteUser, deleteUserGroup, deleteUserGroup, execInputStringMapCmd, execInputStringStreamingMapComd, execMapCmd, execMapCmd, execQuietMapCmd, execQuietStreamCmd, execStreamCmd, execStreamCmd, execStreamingMapCommand, fixJobs, fixJobs, getAuthTicket, getBranchSpec, getBranchSpecs, getBranchSpecs, getChangelist, getChangelistDiffs, getChangelistDiffs, getChangelistDiffsStream, getChangelistFiles, getChangelists, getChangelists, getChangelists, getCharsetName, getClient, getClient, getClientName, getClients, getClients, getClientTemplate, getClientTemplate, getClientTemplate, getCounter, getCounters, getCurrentClient, getDbSchema, getDepot, getDepotFiles, getDepotFiles, getDepots, getDirectories, getDirectories, getExportRecords, getExportRecords, getExtendedFiles, getExtendedFiles, getFileAnnotations, getFileAnnotations, getFileContents, getFileContents, getFileDiffs, getFileDiffs, getFileDiffsStream, getFixes, getFixList, getInfoServerAddress, getInterchanges, getInterchanges, getInterchanges, getInterchanges, getJob, getJobs, getJobs, getJobSpec, getKnownCharsets, getLabel, getLabels, getLabels, getLoginStatus, getMatchingLines, getMatchingLines, getOpenedFiles, getOpenedFiles, getP4TicketsOSLocation, getPreferredPathArray, getPreferredPathArray, getProperties, getProtectionEntries, getProtectionEntries, getReviews, getReviews, getRevisionHistory, getRevisionHistory, getServerFileDiffs, getServerInfo, getServerProcesses, getServerVersion, getServerVersionNumber, getSSOCallback, getSSOKey, getStatus, getSubmittedIntegrations, getSubmittedIntegrations, getUsageOptions, getUser, getUserGroup, getUserGroups, getUserGroups, getUserName, getUsers, getUsers, getWorkingDirectory, guardNull, handleErrorStr, handleFileErrorStr, handleFileReturn, handleFileReturn, handleIntegrationFileReturn, handleIntegrationFileReturn, isCaseSensitive, isConnected, isNonCheckedSyncs, isRunningOnWindows, isUnicode, login, login, login, logout, logout, moveFile, moveFile, parseVersionString, populatePathArray, processInterchangeMaps, registerCallback, registerProgressCallback, registerSSOCallback, setAuthTicket, setCharsetName, setClientName, setCounter, setCounter, setCurrentClient, setFileAttributes, setFileAttributes, setNonCheckedSyncs, setServerConfigurationValue, setUsageOptions, setUserName, setWorkingDirectory, showServerConfiguration, supportsUnicode, tagFiles, tagFiles, updateBranchSpec, updateClient, updateJob, updateLabel, updateUser, updateUser, updateUserGroup, updateUserGroup
 
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
 

Field Detail

IMPL_TYPE

public static final IServerImplMetadata.ImplType IMPL_TYPE
The implementation type of this implementation.


DEFAULT_PROG_NAME

public static final String DEFAULT_PROG_NAME
The default string sent to the Perforce server in the protocol command defining the client's program name. This can be set with the IServer interface.

See Also:
Constant Field Values

DEFAULT_PROG_VERSION

public static final String DEFAULT_PROG_VERSION
The default string sent to the Perforce server in the protocol command defining the client's program version. This can be set with the IServer interface.

See Also:
Constant Field Values

DEFAULT_CLIENT_API_LEVEL

public static final int DEFAULT_CLIENT_API_LEVEL
Default Perforce client API level; 68 represents 2010.2 capabilities. Don't change this unless you know what you're doing. Note that this is a default for most commands; some commands dynamically bump up the level for the command's duration.

See Also:
Constant Field Values

DEFAULT_SERVER_API_LEVEL

public static final int DEFAULT_SERVER_API_LEVEL
Default Perforce server API level; 99999 apparently means "whatever...". Don't change this unless you know what you're doing.

See Also:
Constant Field Values

RPC_TAGS_USED

public static final boolean RPC_TAGS_USED
Signifies whether or not we use tagged output. Don't change this unless you like weird incomprehensible errors and days of debugging.

See Also:
Constant Field Values

RPC_ENV_CWD_KEY

public static final String RPC_ENV_CWD_KEY
The system properties key for the JVM's current directory.

See Also:
Constant Field Values

RPC_ENV_OS_NAME_KEY

public static final String RPC_ENV_OS_NAME_KEY
The system properties key for the OS name.

See Also:
Constant Field Values

RPC_ENV_WINDOWS_PREFIX

public static final String RPC_ENV_WINDOWS_PREFIX
RPC_ENV_OS_NAME_KEY property value prefix for Windows systems.

See Also:
Constant Field Values

RPC_ENV_WINDOWS_SPEC

public static final String RPC_ENV_WINDOWS_SPEC
What we use in the RPC environment packet to signal to the Perforce server that we're a Windows box.

See Also:
Constant Field Values

RPC_ENV_UNIX_SPEC

public static final String RPC_ENV_UNIX_SPEC
What we use in the RPC environment packet to signal to the Perforce server that we're a NON-Windows box.

See Also:
Constant Field Values

RPC_ENV_NOCLIENT_SPEC

public static final String RPC_ENV_NOCLIENT_SPEC
What we use in the RPC environment packet to signal to the Perforce server that we don't have a client set yet or don't know what it is.

See Also:
Constant Field Values

RPC_ENV_NOHOST_SPEC

public static final String RPC_ENV_NOHOST_SPEC
What we use in the RPC environment packet to signal to the Perforce server that we don't have a hostname set yet or don't know what it is.

See Also:
Constant Field Values

RPC_ENV_NOUSER_SPEC

public static final String RPC_ENV_NOUSER_SPEC
What we use in the RPC environment packet to signal to the Perforce server that we don't have a client set yet or don't know what it is.

See Also:
Constant Field Values

TRACE_PREFIX

public static final String TRACE_PREFIX
What we use as a P4JTracer trace prefix for methods here.

See Also:
Constant Field Values

RPC_TMP_OUTFILE_STREAM_KEY

public static final String RPC_TMP_OUTFILE_STREAM_KEY
Used to key temporary output streams in the command environment's state map for things like getFileContents(), etc., using the execStreamCmd method(s).

See Also:
Constant Field Values

RPC_TMP_CONVERTER_KEY

public static final String RPC_TMP_CONVERTER_KEY
Use to key converter to use out of state map

See Also:
Constant Field Values

localHostName

protected String localHostName

clientApiLevel

protected int clientApiLevel

serverApiLevel

protected int serverApiLevel

connectionStart

protected long connectionStart

serverProtocolMap

protected Map<String,Object> serverProtocolMap

serverStats

protected ServerStats serverStats

serverId

protected String serverId

secretKey

protected String secretKey

relaxCmdNameValidationChecks

protected boolean relaxCmdNameValidationChecks
If true, relax the command name validation checks done in the RPC layer. This is dangerous, and any use of this should only be done if you know what you're doing and you're able to deal with the consequences (which won't be spelled out here).

Constructor Detail

RpcServer

public RpcServer()
Method Detail

init

public ServerStatus init(String host,
                         int port,
                         Properties props)
                  throws ConfigException,
                         ConnectionException
The default init sets up things like host names, etc., and fails if we can't establish some pretty basic things at connect time. Does not attempt to actually connect to the target Perforce server -- this is left for the connect() call, below.

Specified by:
init in interface IServerControl
Overrides:
init in class Server
Parameters:
host - the Perforce server hostname or IP address as passed in to the factory method
port - the Perforce server port number as passed in to the factory method
Returns:
the resulting status; should be ACTIVE unless otherwise specified
Throws:
ConfigException - if there's something wrong with the specified configuration or associated config files, etc.
ConnectionException - if the server is unreachable on initialization, and that unreachability is serious and unrecoverable (there are implementations that don't really do connections per se, so they may not consider this an error or even try connecting during initialisation).
See Also:
Server.init(java.lang.String, int, java.util.Properties)

init

public ServerStatus init(String host,
                         int port,
                         Properties props,
                         UsageOptions opts)
                  throws ConfigException,
                         ConnectionException
Description copied from interface: IServerControl
Initialize the server. Called immediately after the server class is instantiated. The semantics of this method are fairly broad: the result of calling this method is that a future call to "normal" server calls must not fail because of any setting-up problems.

Specified by:
init in interface IServerControl
Overrides:
init in class Server
Parameters:
host - the Perforce server hostname or IP address as passed in to the factory method
port - the Perforce server port number as passed in to the factory method
props - the properties passed in to the factory method
opts - the UsageOptions object to be associated with the server object; if null, the server should construct a new default UsageOptions object.
Returns:
the resulting status; should be ACTIVE unless otherwise specified
Throws:
ConfigException - if there's something wrong with the specified configuration or associated config files, etc.
ConnectionException - if the server is unreachable on initialization, and that unreachability is serious and unrecoverable (there are implementations that don't really do connections per se, so they may not consider this an error or even try connecting during initialisation).
See Also:
IServerControl.init(java.lang.String, int, java.util.Properties, com.perforce.p4java.option.UsageOptions)

connect

public void connect()
             throws ConnectionException,
                    AccessException,
                    RequestException,
                    ConfigException
Try to establish an actual RPC connection to the target Perforce server. Most of the actual setup work is done in the RpcConnection and RpcPacketDispatcher constructors, but associated gubbins such as auto login, etc., are done in the superclass.

Specified by:
connect in interface IServer
Overrides:
connect in class Server
Throws:
ConnectionException - if the Perforce server is unreachable or is not connected.
AccessException - if the Perforce server denies access to the caller
RequestException - if the Perforce server encounters an error during its processing of the request
ConfigException - if local I/O exception occurs
See Also:
Server.connect()

disconnect

public void disconnect()
                throws ConnectionException,
                       AccessException
Try to cleanly disconnect from the Perforce server at the other end of the current connection (with the emphasis on "cleanly"). This should theoretically include sending a release2 message, but we don't always get the chance to do that.

Specified by:
disconnect in interface IServer
Overrides:
disconnect in class Server
Throws:
ConnectionException
AccessException
See Also:
Server.disconnect()

supportsSmartMove

public boolean supportsSmartMove()
                          throws ConnectionException,
                                 RequestException,
                                 AccessException
Description copied from interface: IServer
Return true IFF the underlying Perforce server supports the new 2009.1 and later "smart move" command. Note that this returns whether the server can support moves only at the time the server is first created; it's entirely possible for the underlying server to change versions, etc., under the user in the meanitme or over time. In any case, if you do try to run a move command on such a server, the results will be safe, if not entirely what you expected.

Returns:
true iff the server supports the smart move command.
Throws:
ConnectionException - if the Perforce server is unreachable or is not connected.
RequestException - if the Perforce server encounters an error during its processing of the request
AccessException - if the Perforce server denies access to the caller
See Also:
IServer.supportsSmartMove()

getErrorOrInfoStr

public String getErrorOrInfoStr(Map<String,Object> map)
Specified by:
getErrorOrInfoStr in class Server
See Also:
Server.getErrorOrInfoStr(java.util.Map)

isInfoMessage

public boolean isInfoMessage(Map<String,Object> map)
Specified by:
isInfoMessage in class Server

getSeverityCode

public int getSeverityCode(Map<String,Object> map)
Specified by:
getSeverityCode in class Server

getGenericCode

protected int getGenericCode(Map<String,Object> map)
Specified by:
getGenericCode in class Server

getErrorStr

public String getErrorStr(Map<String,Object> map)
RPC impl errors come across the wire as a map in the form usually like this:
 fmt0=Access for user '%user%' has not been enabled by 'p4 protect'.,
 func=client-Message, user=nouser, code0=822483067
 
With tags being used for non-error payloads, we can just basically pick up the presence of the code0 entry; if it's there, use fmt0 as the format and the other args as appropriate...

FIXME: work with multiple code/fmt sets... -- HR.

Specified by:
getErrorStr in class Server
See Also:
Server.getErrorStr(java.util.Map)

getInfoStr

public String getInfoStr(Map<String,Object> map)
Specified by:
getInfoStr in class Server
See Also:
Server.getInfoStr(java.util.Map)

isAuthFail

public boolean isAuthFail(String errStr)
Specified by:
isAuthFail in class Server
See Also:
Server.isAuthFail(java.lang.String)

getClientApiLevel

public int getClientApiLevel()

setClientApiLevel

public void setClientApiLevel(int clientApiLevel)

getPerfMonitor

public PerformanceMonitor getPerfMonitor()

setPerfMonitor

public void setPerfMonitor(PerformanceMonitor perfMonitor)

getOsTypeForEnv

protected String getOsTypeForEnv()

getLanguageForEnv

protected String getLanguageForEnv()

getClientNameForEnv

protected String getClientNameForEnv()

getHostForEnv

protected String getHostForEnv()

getUserForEnv

protected String getUserForEnv()

processCmdCallbacks

protected void processCmdCallbacks(int cmdCallBackKey,
                                   long timeTaken,
                                   Map<String,Object>[] retMap)

saveCurrentTicket

public void saveCurrentTicket()
                       throws P4JavaException
Save current ticket returned from Server.getAuthTicket().

Throws:
P4JavaException
See Also:
saveTicket(String)

saveTicket

public void saveTicket(String ticketValue)
                throws ConfigException
Save specified auth ticket value as associate with this server's address and configured user returned from Server.getUserName(). This will attempt to write an entry to the p4tickets file either specified as the P4TICKETS environment variable or at the OS specific default location. If the ticket value is null then the current entry in the will be cleared.

Parameters:
ticketValue -
Throws:
ConfigException

loadTicket

public String loadTicket(String serverId)
Get the p4tickets entry value for the current user returned from Server.getUserName() and server address based upon a search of either the file found at PropertyDefs.TICKET_PATH_KEY_SHORT_FORM, PropertyDefs.TICKET_PATH_KEY, the P4TICKETS environment variable or the standard p4tickets file location for the current OS. Will return null if not found or if an error occured attempt to lookup the value.

Parameters:
serverId -
Returns:
- ticket value to get used for Server.setAuthTicket(String) or null if not found.

setServerId

public void setServerId(String serverId)
Set the server's id field used for storing authentication tickets. The id specified here will be used when saving ticket values to a p4 tickets file. This field should only be set to the server id returned as part of a server message.

Parameters:
serverId -

getServerId

public String getServerId()
Get the server's id field used for storing authentication tickets. This id should only be used as a server address portion for entries in a p4 tickets file.

Returns:
- possibly null server id

writeInPlace

protected boolean writeInPlace(String cmdName)
Return true iff we should be performing server -> client file write I/O operations in place for this command.

See PropertyDefs.WRITE_IN_PLACE_KEY javadoc for the semantics of this.

Parameters:
cmdName - non-null command command name string
Returns:
true iff we should do a sync in place

getSecretKey

public String getSecretKey()

setSecretKey

public void setSecretKey(String secretKey)

isRelaxCmdNameValidationChecks

protected boolean isRelaxCmdNameValidationChecks()

setRelaxCmdNameValidationChecks

protected void setRelaxCmdNameValidationChecks(boolean relaxCmdNameValidationChecks)


Copyright © 2011 Perforce Software. All Rights Reserved.