| /* |
| * Licensed to the Apache Software Foundation (ASF) under one |
| * or more contributor license agreements. See the NOTICE file |
| * distributed with this work for additional information |
| * regarding copyright ownership. The ASF licenses this file |
| * to you 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.axis2.dataretrieval; |
| |
| import org.apache.axiom.om.OMElement; |
| import org.apache.axis2.context.MessageContext; |
| import org.apache.axis2.description.AxisService; |
| import org.apache.commons.logging.Log; |
| import org.apache.commons.logging.LogFactory; |
| |
| import javax.xml.namespace.QName; |
| import java.util.ArrayList; |
| import java.util.HashMap; |
| import java.util.Iterator; |
| |
| /** |
| * The Default Axis2 Data Locator implementation |
| */ |
| |
| public class AxisDataLocatorImpl implements AxisDataLocator { |
| private static final Log log = LogFactory.getLog(AxisDataLocatorImpl.class); |
| |
| // HashMap to cache Data elements defined in ServiceData. |
| private HashMap dataMap = new HashMap(); |
| |
| private AxisService axisService; |
| |
| |
| /** |
| * Constructor |
| * |
| * @throws DataRetrievalException |
| */ |
| public AxisDataLocatorImpl(AxisService in_axisService) throws DataRetrievalException { |
| super(); |
| axisService = in_axisService; |
| } |
| |
| /** |
| * Retrieves and returns data based on the specified request. |
| */ |
| public Data[] getData(DataRetrievalRequest request, |
| MessageContext msgContext) throws DataRetrievalException { |
| Data[] data = null; |
| String dialect = request.getDialect(); |
| String identifier = request.getIdentifier(); |
| String key = dialect; |
| ArrayList dataList = new ArrayList(); |
| if (identifier != null) { |
| key = key + identifier; |
| if (dataMap.get(key) != null) { |
| dataList.add(dataMap.get(key)); |
| } |
| } else { |
| dataList = getDataList(dialect); |
| } |
| |
| |
| AxisDataLocator dataLocator = DataLocatorFactory |
| .createDataLocator(dialect, (ServiceData[]) dataList.toArray(new ServiceData[0])); |
| |
| if (dataLocator != null) { |
| try { |
| data = dataLocator.getData(request, msgContext); |
| } |
| catch (Throwable e) { |
| log.info("getData request failed for dialect, " + dialect, e); |
| throw new DataRetrievalException(e); |
| } |
| } else { |
| String message = "Failed to instantiate Data Locator for dialect, " + dialect; |
| log.info(message); |
| throw new DataRetrievalException(message); |
| } |
| return data; |
| } |
| |
| /* |
| * For AxisService use only! |
| */ |
| public void loadServiceData() { |
| DataRetrievalUtil util = DataRetrievalUtil.getInstance(); |
| |
| OMElement serviceData = null; |
| String file = "META-INF/" + DRConstants.SERVICE_DATA.FILE_NAME; |
| try { |
| serviceData = util.buildOM(axisService.getClassLoader(), |
| "META-INF/" + DRConstants.SERVICE_DATA.FILE_NAME); |
| } catch (DataRetrievalException e) { |
| // It is not required to define ServiceData for a Service, just log a warning message |
| |
| String message = "Check loading failure for file, " + file; |
| log.debug(message + ".Message = " + e.getMessage()); |
| log.debug(message, e); |
| } |
| if (serviceData != null) { |
| cachingServiceData(serviceData); |
| } |
| } |
| |
| /* |
| * caching ServiceData for Axis2 Data Locators |
| */ |
| private void cachingServiceData(OMElement e) { |
| Iterator i = e.getChildrenWithName(new QName( |
| DRConstants.SERVICE_DATA.DATA)); |
| String saveKey = ""; |
| while (i.hasNext()) { |
| ServiceData data = new ServiceData((OMElement) i.next()); |
| saveKey = data.getDialect(); |
| |
| String identifier = data.getIdentifier(); |
| if (identifier != null) { |
| saveKey = saveKey + identifier; |
| } |
| dataMap.put(saveKey, data); |
| |
| |
| } |
| |
| } |
| |
| /* |
| * Return ServiceData for specified dialect |
| */ |
| private ArrayList getDataList(String dialect) { |
| ArrayList dataList = new ArrayList(); |
| Iterator keys = dataMap.keySet().iterator(); |
| |
| while (keys.hasNext()) { |
| String keyStr = (String) keys.next(); |
| // get all Data element that matching the dialect |
| if (keyStr.indexOf(dialect) == 0) { |
| dataList.add(dataMap.get(keyStr)); |
| } |
| } |
| return dataList; |
| } |
| } |