blob: dde940968ddcbf30996a1dc16f24360c9783d4e5 [file] [log] [blame]
/*
* Copyright 2001-2008 The Apache Software Foundation.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*
*/
package org.apache.juddi.api.impl;
import java.util.GregorianCalendar;
import java.util.List;
import java.util.UUID;
import java.util.Vector;
import javax.jws.WebService;
import javax.persistence.EntityManager;
import javax.persistence.EntityTransaction;
import javax.persistence.Query;
import javax.xml.datatype.DatatypeConfigurationException;
import javax.xml.datatype.DatatypeFactory;
import javax.xml.datatype.XMLGregorianCalendar;
import javax.xml.ws.Holder;
import org.apache.commons.configuration.ConfigurationException;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.juddi.api.util.CustodyTransferQuery;
import org.apache.juddi.api.util.QueryStatus;
import org.apache.juddi.api.util.ValueSetValidationQuery;
import org.apache.juddi.config.AppConfig;
import org.apache.juddi.config.PersistenceManager;
import org.apache.juddi.config.Property;
import org.apache.juddi.model.BindingTemplate;
import org.apache.juddi.model.BusinessEntity;
import org.apache.juddi.model.BusinessService;
import org.apache.juddi.model.TransferTokenKey;
import org.apache.juddi.model.UddiEntity;
import org.apache.juddi.model.UddiEntityPublisher;
import org.apache.juddi.query.util.DynamicQuery;
import org.apache.juddi.v3.error.ErrorMessage;
import org.apache.juddi.v3.error.FatalErrorException;
import org.apache.juddi.validation.ValidateCustodyTransfer;
import org.uddi.custody_v3.DiscardTransferToken;
import org.uddi.custody_v3.KeyBag;
import org.uddi.custody_v3.TransferEntities;
import org.uddi.v3_service.DispositionReportFaultMessage;
import org.uddi.v3_service.UDDICustodyTransferPortType;
@WebService(serviceName="UDDICustodyTransferService",
endpointInterface="org.uddi.v3_service.UDDICustodyTransferPortType",
targetNamespace = "urn:uddi-org:v3_service")
public class UDDICustodyTransferImpl extends AuthenticatedService implements UDDICustodyTransferPortType {
public static final String TRANSFER_TOKEN_PREFIX = "transfertoken:";
public static final int DEFAULT_TRANSFEREXPIRATION_DAYS = 3;
private static Log logger = LogFactory.getLog(UDDICustodyTransferImpl.class);
private UDDIServiceCounter serviceCounter;
public UDDICustodyTransferImpl() {
super();
serviceCounter = ServiceCounterLifecycleResource.getServiceCounter(this.getClass());
}
@SuppressWarnings("unchecked")
public void discardTransferToken(DiscardTransferToken body)
throws DispositionReportFaultMessage {
long startTime = System.currentTimeMillis();
EntityManager em = PersistenceManager.getEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
UddiEntityPublisher publisher = this.getEntityPublisher(em, body.getAuthInfo());
new ValidateCustodyTransfer(publisher).validateDiscardTransferToken(em, body);
org.uddi.custody_v3.TransferToken apiTransferToken = body.getTransferToken();
if (apiTransferToken != null) {
String transferTokenId = new String(apiTransferToken.getOpaqueToken());
org.apache.juddi.model.TransferToken modelTransferToken = em.find(org.apache.juddi.model.TransferToken.class, transferTokenId);
if (modelTransferToken != null)
em.remove(modelTransferToken);
}
KeyBag keyBag = body.getKeyBag();
if (keyBag != null) {
List<String> keyList = keyBag.getKey();
Vector<DynamicQuery.Parameter> params = new Vector<DynamicQuery.Parameter>(0);
for (String key : keyList) {
// Creating parameters for key-checking query
DynamicQuery.Parameter param = new DynamicQuery.Parameter("UPPER(ttk.entityKey)",
key.toUpperCase(),
DynamicQuery.PREDICATE_EQUALS);
params.add(param);
}
// Find the associated transfer tokens and remove them.
DynamicQuery getTokensQry = new DynamicQuery();
getTokensQry.append("select distinct ttk.transferToken from TransferTokenKey ttk").pad();
getTokensQry.WHERE().pad().appendGroupedOr(params.toArray(new DynamicQuery.Parameter[0]));
Query qry = getTokensQry.buildJPAQuery(em);
List<org.apache.juddi.model.TransferToken> tokensToDelete = qry.getResultList();
if (tokensToDelete != null && tokensToDelete.size() > 0) {
for (org.apache.juddi.model.TransferToken tt : tokensToDelete)
em.remove(tt);
}
}
tx.commit();
long procTime = System.currentTimeMillis() - startTime;
serviceCounter.update(CustodyTransferQuery.DISCARD_TRANSFERTOKEN,
QueryStatus.SUCCESS, procTime);
} finally {
if (tx.isActive()) {
tx.rollback();
}
em.close();
}
}
public void getTransferToken(String authInfo, KeyBag keyBag,
Holder<String> nodeID, Holder<XMLGregorianCalendar> expirationTime,
Holder<byte[]> opaqueToken) throws DispositionReportFaultMessage {
long startTime = System.currentTimeMillis();
EntityManager em = PersistenceManager.getEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
UddiEntityPublisher publisher = this.getEntityPublisher(em, authInfo);
new ValidateCustodyTransfer(publisher).validateGetTransferToken(em, keyBag);
int transferExpirationDays = DEFAULT_TRANSFEREXPIRATION_DAYS;
try {
transferExpirationDays = AppConfig.getConfiguration().getInt(Property.JUDDI_TRANSFER_EXPIRATION_DAYS);
// For output
nodeID.value = AppConfig.getConfiguration().getString(Property.JUDDI_NODE_ID);
}
catch(ConfigurationException ce)
{ throw new FatalErrorException(new ErrorMessage("errors.configuration.Retrieval"));}
String transferKey = TRANSFER_TOKEN_PREFIX + UUID.randomUUID();
org.apache.juddi.model.TransferToken transferToken = new org.apache.juddi.model.TransferToken();
transferToken.setTransferToken(transferKey);
// For output
opaqueToken.value = transferKey.getBytes();
GregorianCalendar gc = new GregorianCalendar();
gc.add(GregorianCalendar.DAY_OF_MONTH, transferExpirationDays);
transferToken.setExpirationDate(gc.getTime());
try {
DatatypeFactory df = DatatypeFactory.newInstance();
// For output
expirationTime.value = df.newXMLGregorianCalendar(gc);
}
catch(DatatypeConfigurationException ce)
{ throw new FatalErrorException(new ErrorMessage("errors.Unspecified"));}
List<String> keyList = keyBag.getKey();
for (String key : keyList) {
TransferTokenKey tokenKey = new TransferTokenKey(transferToken, key);
transferToken.getTransferKeys().add(tokenKey);
}
em.persist(transferToken);
tx.commit();
long procTime = System.currentTimeMillis() - startTime;
serviceCounter.update(CustodyTransferQuery.GET_TRANSFERTOKEN,
QueryStatus.SUCCESS, procTime);
} finally {
if (tx.isActive()) {
tx.rollback();
}
em.close();
}
}
public void transferEntities(TransferEntities body)
throws DispositionReportFaultMessage {
long startTime = System.currentTimeMillis();
EntityManager em = PersistenceManager.getEntityManager();
EntityTransaction tx = em.getTransaction();
try {
tx.begin();
UddiEntityPublisher publisher = this.getEntityPublisher(em, body.getAuthInfo());
new ValidateCustodyTransfer(publisher).validateTransferEntities(em, body);
// Once validated, the ownership transfer is as simple as switching the publisher
KeyBag keyBag = body.getKeyBag();
List<String> keyList = keyBag.getKey();
for (String key : keyList) {
UddiEntity uddiEntity = em.find(UddiEntity.class, key);
uddiEntity.setAuthorizedName(publisher.getAuthorizedName());
if (uddiEntity instanceof BusinessEntity) {
BusinessEntity be = (BusinessEntity)uddiEntity;
List<BusinessService> bsList = be.getBusinessServices();
for (BusinessService bs : bsList) {
bs.setAuthorizedName(publisher.getAuthorizedName());
List<BindingTemplate> btList = bs.getBindingTemplates();
for (BindingTemplate bt : btList)
bt.setAuthorizedName(publisher.getAuthorizedName());
}
}
}
// After transfer is finished, the token can be removed
org.uddi.custody_v3.TransferToken apiTransferToken = body.getTransferToken();
String transferTokenId = new String(apiTransferToken.getOpaqueToken());
org.apache.juddi.model.TransferToken modelTransferToken = em.find(org.apache.juddi.model.TransferToken.class, transferTokenId);
em.remove(modelTransferToken);
tx.commit();
long procTime = System.currentTimeMillis() - startTime;
serviceCounter.update(CustodyTransferQuery.TRANSFER_ENTITIES,
QueryStatus.SUCCESS, procTime);
} finally {
if (tx.isActive()) {
tx.rollback();
}
em.close();
}
}
}