コード例 #1
0
	def __init__(self, catalog, repo, xfer, userDB):
		self.catalog, self.repo, self.xfer, self.userDB = catalog, repo, xfer, userDB
		self.tracker = TransferStatusTracker(self.catalog)
コード例 #2
0
class FileMgrDispatcher(Dispatcher):
	'''The file manager dispatcher handles all XML-RPC calls.
	'''
	def __init__(self, catalog, repo, xfer, userDB):
		self.catalog, self.repo, self.xfer, self.userDB = catalog, repo, xfer, userDB
		self.tracker = TransferStatusTracker(self.catalog)
	
	def handleRequest(self, methodSpecifier, params, user, password):
		'''Handle an XML-RPC request.  First, authenticate the user.  If the user's
		authentic (by dint of providing a correct user ID and password pair), then
		authorize if the method the user is trying to call is available.
		'''
		password = _encodePassword(password)
		if self.userDB.authenticate(user, password):
			if self.userDB.authorize(user, methodSpecifier):
				obj, method = methodSpecifier.split('.')
				if obj not in ('filemgr', 'usermgr'):
					raise ValueError('Unknown object')
				func = getattr(self, method)
				return func(params)
			raise ValueError('Not authorized for "%s"' % methodSpecifier)
		raise ValueError('Illegal user name "%s" and/or password' % user)
	
	def getProductTypeByName(self, params):
		return Result(None, Structs.getXmlRpcProductType(self.repo.getProductTypeByName(params[0])))
	
	def ingestProduct(self, params):
		productHash, metadata, clientXfer = params
		p = Structs.getProductFromXmlRpc(productHash)
		p.setTransferStatus(Product.STATUS_TRANSFER)
		self.catalog.addProduct(p)
		
		m = Metadata()
		m.addMetadata(metadata)
		self.catalog.addMetadata(m, p)
		
		if not clientXfer:
	                versioner = GenericFileManagerObjectFactory.getVersionerFromClassName(p.getProductType().getVersioner())
			versioner.createDataStoreReferences(p, m)
			self.catalog.addProductReferences(p)
			self.xfer.transferProduct(p)
			p.setTransferStatus(Product.STATUS_RECEIVED)
			self.catalog.setProductTranfserStatus(p)
		return Result(None, p.getProductId())
	
	def addProductReferences(self, params):
		self.catalog.addProductReferences(Structs.getProductFromXmlRpc(params[0]))
		return Result(Boolean, 'true')
	
	def transferringProduct(self, params):
		self.tracker.transferringProduct(Structs.getProductFromXmlRpc(params[0]))
		return Result(Boolean, 'true')
	
	def removeProductTransferStatus(self, params):
		self.tracker.removeProductTransferStatus(Structs.getProductFromXmlRpc(params[0]))
		return Result(Boolean, 'true')
	
	def setProductTransferStatus(self, params):
		self.catalog.setProductTransferStatus(Structs.getProductFromXmlRpc(params[0]))
		return Result(Boolean, 'true')
		
	def getCurrentFileTransfer(self, params):
		status = self.tracker.getCurrentFileTransfer()
		if status is None:
			return Result(None, Hashtable())
		else:
			return Result(None, Structs.getXmlRpcFileTransferStatus(status))
	
	def getCurrentFileTransfers(self, params):
		xfers = self.tracker.getCurrentFileTransfers()
		if xfers is not None and len(xfers) > 0:
			return Result(None, Structs.getXmlRpcFileTransferStatuses(xfers))
		else:
			return Result(None, Vector())
	
	def getProductPctTransferred(self, params):
		return Result(Double, str(self.tracker.getPctTransferred((Structs.getProductFromXmlRpc(params[0])))))
	
	def getRefPctTransferred(self, params):
		pct = self.tracker.getPctTransferred(Structs.getReferenceFromXmlRpc(params[0]))
		return Result(Double, str(pct))
	
	def isTransferComplete(self, params):
		return Result(Boolean, _toJavaBoolean(self.tracker.isTransferComplete(Structs.getProductFromXmlRpc(params[0]))))
	
	def pagedQuery(self, params):
		ptype = Structs.getProductTypeFromXmlRpc(params[1])
		query = Structs.getQueryFromXmlRpc(params[0])
		return Result(None, Structs.getXmlRpcProductPage(self.catalog.pagedQuery(query, ptype, params[2])))
	
	def getFirstPage(self, params):
		ptype = Structs.getProductTypeFromXmlRpc(params[0])
		return Result(None, Structs.getXmlRpcProductPage(self.catalog.getFirstPage(ptype)))
	
	def getLastPage(self, params):
		ptype = Structs.getProductTypeFromXmlRpc(params[0])
		return Result(None, Structs.getXmlRpcProductPage(self.catalog.getLastProductPage(ptype)))
	
	def getNextPage(self, params):
		ptype = Structs.getProductTypeFromXmlRpc(params[0])
		page = Structs.getProductPageFromXmlRpc(params[1])
		return Result(None, Structs.getXmlRpcProductPage(self.catalog.getNextPage(ptype, page)))
	
	def getPrevPage(self, params):
		ptype = Structs.getProductTypeFromXmlRpc(params[0])
		page = Structs.getProductPageFromXmlRpc(params[1])
		return Result(None, Structs.getXmlRpcProductPage(self.catalog.getPrevPage(ptype, page)))
		
	def addProductType(self, params):
		ptype = Structs.getProductTypeFromXmlRpc(params[0])
		self.repo.addProductType(ptype)
		return Result(None, ptype.getProductTypeId())
	
	def getNumProducts(self, params):
		ptype = Structs.getProductTypeFromXmlRpc(params[0])
		return Result(Integer, str(self.catalog.getNumProducts(ptype)))
	
	def getTopNProducts(self, params):
		if len(params) == 1:
			return Result(None, Structs.getXmlRpcProductList(self.catalog.getTopNProducts(params[0])))
		ptype = Structs.getProductTypeFromXmlRpc(params[1])
		return Result(None, Structs.getXmlRpcProductList(self.catalog.getTopNProducts(params[0], ptype)))
	
	def hasProduct(self, params):
		p = self.catalog.getProductByName(params[0])
		return Result(Boolean, _toJavaBoolean(p is not None and p.transferStatus == Product.STATUS_RECEIVED))
	
	def getMetadata(self, params):
		return Result(None, self.catalog.getMetadata(Structs.getProductFromXmlRpc(params[0])).getHashtable())
	
	def getProductTypes(self, params):
		return Result(None, Structs.getXmlRpcProductList(self.repo.getProductTypes()))
	
	def getProductReferences(self, params):
		p = Structs.getProductFromXmlRpc(params[0])
		return Result(None, Structs.getXmlRpcReferences(self.catalog.getProductReferences(p)))
	
	def getProductById(self, params):
		return Result(None, Structs.getXmlRpcProduct(self.catalog.getProductById(params[0])))
	
	def getProductByName(self, params):
		return Result(None, Structs.getXmlRpcProduct(self.catalog.getProductByName(params[0])))
	
	def getProductsByProductType(self, params):
		ptype = Structs.getProductTypeFromXmlRpc(params[0])
		return Result(None, Structs.getXmlRpcProductList(self.catalog.getProductsByProductType(ptype)))
	
	def getElementsByProductType(self, params):
		ptype = Structs.getProductTypeFromXmlRpc(params[0])
		return Structs.getXmlRpcElementList(self.catalog.getValidationLayer().getElements(ptype))
	
	def getElementById(self, params):
		return Structs.getXmlRpcElement(self.catalog.getValidationLayer().getElementById(params[0]))
		
	def getElementByName(self, params):
		return Structs.getXmlRpcElement(self.catalog.getValidationLayer().getElementByName(params[0]))
	
	def query(self, params):
		q = Structs.getQueryFromXmlRpc(params[0])
		ptype = Structs.getProductTypeFromXmlRpc(params[1])
		ids = self.catalog.query(q, ptype)
		if ids is not None and len(ids) > 0:
			return Result(None, [self.catalog.getProductById(i) for i in ids])
		return Result(None, Vector())
	
	def getProductTypeById(self, params):
		ptype = self.repo.getProductTypeById(params[0])
		return Result(None, Structs.getXmlRpcProductType(ptype))
	
	def catalogProduct(self, params):
		p = Structs.getProductFromXmlRpc(params[0])
		return Result(None, self.catalog.addProduct(p))
	
	def addMetadata(self, params):
		p = Structs.getProductFromXmlRpc(params[0])
		m = Metadata()
		m.addMetadata(params[1])
		self.catalog.addMetadata(m, p)
		return Result(Boolean, 'true')
		
	def transferFile(self, params):
		outFile, data, offset, numBytes = params
		if os.path.exists(outFile):
			out = file(outFile, 'ab')
		else:
			dirPath = os.dirname(outFile)
			os.makedirs(dirPath)
			out = file(outFile, 'wb')
		out.seek(offset)
		out.write(data)
		out.close()
		return Result(Boolean, 'true')
	
	def removeFile(self, params):
		os.remove(params[0])
		return Result(Boolean, 'true')
		
	def addUser(self, params):
		userID = params[0]
		user = User(userID, params[1], params[2], _encodePassword(params[3]), [])
		self.userDB.users[userID] = user
		self.userDB.save()
		return Result(Boolean, 'true')
		
	def removeUser(self, params):
		del self.userDB.users[params[0]]
		return Result(Boolean, 'true')
	
	def addGroup(self, params):
		groupID = params[0]
		group = Group(groupID, params[1], params[2])
		self.userDB.groups[groupID] = group
		self.userDB.save()
		return Result(Boolean, 'true')
	
	def removeGroup(self, params):
		groupID = params[0]
		del self.userDB.groups[groupID]
		for user in self.userDB.users.itervalues():
			indexes = []
			index = 0
			for group in user.groups:
				if group.groupID == groupID:
					indexes.append(index)
				index += 1
			indexes.reverse()
			for index in indexes:
				del user.groups[index]
		self.userDB.save()
		return Result(Boolean, 'true')
		
	def addUserToGroup(self, params):
		self.userDB.users[params[0]].groups.append(self.userDB.groups[params[1]])
		return Result(Boolean, 'true')

	def removeUserFromGroup(self, params):
		groupID = params[1]
		user = self.userDB.users[params[0]]
		indexes = []
		index = 0
		for group in user.group:
			if group.groupID == groupID:
				indexes.append(index)
			index += 1
		indexes.reverse()
		for index in indexes:
			del user.groups[index]
		self.userDB.save()
		return Result(Boolean, 'true')
		
	def addPermissionToGroup(self, params):
		self.userDB.groups[params[0]].perms.append(params[1])
		self.userDB.save()
		return Result(Boolean, 'true')
		
	def removePermissionFromGroup(self, params):
		permName = params[1]
		group = self.userDB.groups[params[0]]
		indexes = []
		index = 0
		for perm in group.perms:
			if perm == permName:
				indexes.append(index)
		indexes.reverse()
		for index in indexes:
			del group.perms[index]
		self.userDB.save()
		return Result(Boolean, 'true')