Java tutorial
/* * 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; /** * This implements the UDDI v3 Custody Transfer API web service * */ @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(); } } }