You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stratos.apache.org by is...@apache.org on 2014/03/07 13:26:34 UTC

[02/12] git commit: Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-stratos into lb_logic_refactoring

Merge branch 'master' of https://git-wip-us.apache.org/repos/asf/incubator-stratos into lb_logic_refactoring


Project: http://git-wip-us.apache.org/repos/asf/incubator-stratos/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-stratos/commit/eaedb07c
Tree: http://git-wip-us.apache.org/repos/asf/incubator-stratos/tree/eaedb07c
Diff: http://git-wip-us.apache.org/repos/asf/incubator-stratos/diff/eaedb07c

Branch: refs/heads/master
Commit: eaedb07ca0dec60fc22e86bd450a8817be8d83d8
Parents: 459ebb4 d2be6fe
Author: Isuru <is...@wso2.com>
Authored: Sat Feb 15 13:15:12 2014 +0530
Committer: Isuru <is...@wso2.com>
Committed: Sat Feb 15 13:15:12 2014 +0530

----------------------------------------------------------------------
 .gitignore                                      |   3 +
 .../autoscaler/NetworkPartitionLbHolder.java    |  41 +-
 .../stratos/autoscaler/PartitionContext.java    |  17 +
 .../topology/AutoscalerTopologyReceiver.java    |  51 +-
 .../autoscaler/partition/PartitionManager.java  |  14 +
 .../stratos/cartridge/agent/CartridgeAgent.java |  72 +-
 .../apache/stratos/cartridge/agent/Main.java    |   1 +
 .../config/CartridgeAgentConfiguration.java     |  15 +
 .../agent/data/publisher/DataContext.java       |  52 ++
 .../agent/data/publisher/DataPublisher.java     |  97 ++
 .../publisher/DataPublisherConfiguration.java   | 161 ++++
 .../exception/DataPublisherException.java       |  31 +
 .../agent/data/publisher/log/Constants.java     |  29 +
 .../publisher/log/FileBasedLogPublisher.java    | 109 +++
 .../agent/data/publisher/log/LogPublisher.java  |  49 +
 .../data/publisher/log/LogPublisherManager.java | 105 +++
 .../publisher/HealthStatisticsNotifier.java     |   2 +-
 .../publisher/HealthStatisticsReader.java       |   3 +-
 .../agent/util/CartridgeAgentConstants.java     |   3 +
 .../agent/util/CartridgeAgentUtils.java         |  12 +-
 .../java/org/apache/stratos/cli/CliTool.java    |   2 +-
 .../stratos/cli/CommandLineApplication.java     |  32 +-
 .../apache/stratos/cli/GenericRestClient.java   |   4 +-
 .../java/org/apache/stratos/cli/RestClient.java |  38 +-
 .../stratos/cli/RestCommandLineService.java     | 624 ++++++++++---
 .../apache/stratos/cli/StratosApplication.java  |  40 +-
 .../stratos/cli/beans/cartridge/Cartridge.java  |  18 +
 .../beans/cartridge/ServiceDefinitionBean.java  |  86 ++
 .../cli/commands/ActivateTenantCommand.java     |  70 ++
 .../cli/commands/DeactivateTenantCommand.java   |  70 ++
 .../cli/commands/DeleteTenantCommand.java       |  70 ++
 .../DeployServiceDeploymentCommand.java         | 139 +++
 .../DescribeAutoScalingPolicyCommand.java       |   2 +-
 .../stratos/cli/commands/ExitCommand.java       |   7 +-
 .../cli/commands/ListDeployServiceCommand.java  |  65 ++
 .../UndeployCartridgeDefinitionCommand.java     |  70 ++
 .../UndeployServiceDefinitionCommand.java       |  70 ++
 .../apache/stratos/cli/utils/CliConstants.java  |  36 +-
 .../org.apache.stratos.cloud.controller/pom.xml |   3 -
 .../axiom/parser/CartridgeConfigParser.java     | 384 --------
 .../parser/CloudControllerConfigParser.java     |   2 +-
 .../cloud/controller/iaases/AWSEC2Iaas.java     | 114 +++
 .../controller/iaases/OpenstackNovaIaas.java    | 134 ++-
 .../cloud/controller/iaases/VCloudIaas.java     |  24 +
 .../impl/CloudControllerServiceImpl.java        | 104 ++-
 .../cloud/controller/interfaces/Iaas.java       |  29 +
 .../jcloud/ComputeServiceBuilderUtil.java       |   5 +
 .../cloud/controller/pojo/CartridgeConfig.java  |  10 +
 .../cloud/controller/pojo/CartridgeInfo.java    |  28 +-
 .../cloud/controller/pojo/ClusterContext.java   |  53 +-
 .../cloud/controller/pojo/IaasProvider.java     |   9 +
 .../cloud/controller/pojo/MemberContext.java    |  10 +
 .../controller/pojo/PersistanceMapping.java     |  27 +-
 .../runtime/FasterLookUpDataHolder.java         | 223 +----
 .../controller/topology/TopologyBuilder.java    |   6 +-
 .../topology/TopologyEventPublisher.java        |   4 +-
 .../controller/util/CloudControllerUtil.java    |  57 +-
 .../validate/AWSEC2PartitionValidator.java      |   2 +-
 .../OpenstackNovaPartitionValidator.java        |   2 +-
 .../axiom/FasterLookupDataHolderTest.java       |  92 ++
 .../balancer/algorithm/AlgorithmContext.java    |  10 +-
 .../balancer/cache/AlgorithmContextCache.java   |  45 +
 .../load/balancer/cache/LoadBalancerCache.java  | 130 +++
 .../stratos/load/balancer/util/Constants.java   |   3 +
 .../balancer/test/RoundRobinAlgorithmTest.java  |  70 --
 .../console/cartridge_info.jag                  |   9 +
 .../console/cartridges.jag                      |   4 +-
 .../console/config/console.js                   |  23 +-
 .../console/config/console.json                 |   8 +-
 .../console/configure_stratos.jag               |  20 +-
 .../console/configure_stratos_wizard.jag        |  16 +-
 .../controllers/cartridgeDefintionSubmit.jag    |   7 +-
 .../controllers/cartridgeSubscribeSubmit.jag    |  10 +
 .../controllers/cartridgeUnsubscribeSubmit.jag  |  11 +
 .../console/controllers/login.jag               |   2 +-
 .../console/controllers/loginSubmit.jag         |   3 +-
 .../console/controllers/logout.jag              |   5 +-
 .../console/controllers/router.jag              |  27 +-
 .../console/controllers/wizardSubmit.jag        |  33 +-
 .../console/index.jag                           |   1 -
 .../console/lbs.jag                             |  20 -
 .../console/modules/pinch.min.js                |   4 +
 .../console/subscribe_cartridge.jag             |   6 +-
 .../console/themes/theme1/pages/index.hbs       |  19 +
 .../themes/theme1/partials/cartridge_info.hbs   |  37 +
 .../themes/theme1/partials/cartridges.hbs       |  25 +-
 .../partials/configure_stratos_wizard.hbs       | 779 ++++++++--------
 .../console/themes/theme1/partials/header.hbs   | 242 +++--
 .../console/themes/theme1/partials/lbs.hbs      |  88 --
 .../themes/theme1/partials/mycartridges.hbs     |  25 +-
 .../theme1/partials/subscribe_cartridge.hbs     | 101 ++-
 .../themes/theme1/partials/tenant_new.hbs       |   4 +-
 .../theme1/renderers/cartridge_deployments.js   |  45 -
 .../themes/theme1/renderers/cartridge_info.js   |  42 +
 .../themes/theme1/renderers/cartridges.js       |  11 +-
 .../theme1/renderers/configure_stratos.js       |  54 +-
 .../renderers/configure_stratos_wizard.js       |  55 +-
 .../console/themes/theme1/renderers/index.js    |  18 +-
 .../console/themes/theme1/renderers/lbs.js      |  47 -
 .../theme1/renderers/mt_service_deployments.js  |  48 -
 .../theme1/renderers/partition_deployments.js   |  46 -
 .../theme1/renderers/policy_deployments.js      |  46 -
 .../theme1/renderers/subscribe_cartridge.js     |   5 +-
 .../console/themes/theme1/theme.js              |   7 +
 .../console/themes/theme1/ui/css/main.css       |  66 +-
 .../themes/theme1/ui/custom-fonts/style.css     |  25 +-
 .../console/themes/theme1/ui/js/mycartridges.js |  12 +
 .../console/themes/theme1/ui/js/popup.js        |  80 ++
 .../console/themes/theme1/ui/js/wizard.js       |  32 +-
 .../console/util/utility.jag                    |  85 +-
 .../client/CloudControllerServiceClient.java    |   6 +-
 .../DataCartridgeSubscriptionConnector.java     |  34 +-
 .../stratos/manager/deploy/service/Service.java |   7 +-
 .../service/ServiceDeploymentManager.java       |  24 +
 .../apache/stratos/manager/dto/Cartridge.java   |  76 +-
 .../internal/ADCManagementServerComponent.java  |   2 -
 .../manager/lookup/LookupDataHolder.java        |  21 +
 .../manager/lookup/SubscriptionContext.java     |   2 +
 .../manager/CartridgeSubscriptionManager.java   | 123 ++-
 .../manager/persistence/PersistenceManager.java |   2 +
 .../RegistryBasedPersistenceManager.java        |  95 ++
 .../DataInsertionAndRetrievalManager.java       |  20 +
 .../service/ApplicationManagementService.java   | 677 --------------
 .../InstanceInformationManagementService.java   |  58 --
 .../service/RepoNotificationService.java        | 128 ---
 .../manager/service/RepositoryInfoBean.java     |   3 +-
 .../subscription/CartridgeSubscription.java     |  97 +-
 .../subscription/DataCartridgeSubscription.java |   6 +-
 .../manager/subscription/SubscriptionData.java  | 172 ++++
 .../SubscriptionSingleTenantBehaviour.java      |  12 +-
 .../utils/CartridgeSubscriptionUtils.java       |   9 +-
 .../model/TopologyClusterInformationModel.java  |   2 +-
 .../utils/ApplicationManagementUtil.java        | 860 +-----------------
 .../manager/utils/CartridgeConstants.java       |  23 -
 .../manager/utils/PersistenceManager.java       | 892 -------------------
 .../manager/utils/RepositoryFactory.java        | 131 ---
 .../stratos/manager/utils/StratosDBUtils.java   | 213 -----
 .../src/main/resources/META-INF/services.xml    |  57 +-
 .../messaging/domain/topology/Service.java      |   4 +-
 .../event/topology/ClusterRemovedEvent.java     |   8 +-
 .../stratos/messaging/util/Constants.java       |  11 +-
 .../rest/endpoint/bean/CartridgeInfoBean.java   |  36 +
 .../stratos/rest/endpoint/bean/Error.java       |  25 +
 .../endpoint/bean/StratosAdminResponse.java     |  36 +
 .../definition/CartridgeDefinitionBean.java     |   2 +
 .../definition/PersistanceMappingBean.java      |   4 +-
 .../bean/util/converter/PojoConverter.java      |  30 +-
 .../stratos/rest/endpoint/mock/MockContext.java |  43 +
 .../rest/endpoint/mock/StratosTestAdmin.java    |  56 +-
 .../rest/endpoint/services/ServiceUtils.java    | 438 ++++++---
 .../rest/endpoint/services/StratosAdmin.java    | 328 +++++--
 .../main/webapp/stratos/WEB-INF/cxf-servlet.xml |   2 +-
 .../resources/conf/cartridge-config.properties  |  64 --
 .../src/main/resources/p2.inf                   |   1 -
 .../distribution/src/main/conf/autoscaler.xml   |   3 +
 .../distribution/src/main/bin/stratos.sh        |  12 +-
 .../distribution/src/main/conf/axis2.xml        | 125 ++-
 .../load-balancer/modules/integration/pom.xml   |  19 +-
 .../tests/AlgorithmContextCacheTest.java        |  55 ++
 .../tests/LoadBalancerTestServerManager.java    |  69 ++
 .../tests/RoundRobinAlgorithmTest.java          |  70 ++
 .../tests/LoadBalancerTestServerManager.java    |  53 --
 .../src/test/resources/instrumentation.txt      |   2 +-
 .../src/test/resources/loadbalancer.conf        | 142 +++
 .../integration/src/test/resources/testng.xml   |  31 +
 .../src/main/conf/cartridge-config.properties   |  42 +-
 .../main/resources/CloudControllerService.wsdl  |  32 +-
 .../puppet/etc/puppet/files/cartridge-agent.sh  |  13 +
 tools/puppet/manifests/classes/lb_cartridge.pp  |  12 +-
 tools/puppet/manifests/classes/mysql.pp         |   4 +-
 tools/puppet/manifests/classes/php_cartridge.pp |  12 +-
 tools/puppet/manifests/nodes.pp                 | 104 ++-
 tools/stratos-installer/README.txt              |  17 +-
 tools/stratos-installer/conf/setup.conf         |  52 +-
 .../cc/repository/conf/cloud-controller.xml     |   1 -
 .../config/cep/repository/conf/jndi.properties  |  16 +-
 .../repository/conf/cartridge-config.properties |  27 -
 tools/stratos-installer/ec2.sh                  |  12 -
 tools/stratos-installer/openstack.sh            |   9 -
 tools/stratos-installer/setup.sh                |  80 +-
 180 files changed, 6295 insertions(+), 5702 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-stratos/blob/eaedb07c/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/utils/CartridgeSubscriptionUtils.java
----------------------------------------------------------------------
diff --cc components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/utils/CartridgeSubscriptionUtils.java
index e80b921,6ea9cb2..d71e107
--- a/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/utils/CartridgeSubscriptionUtils.java
+++ b/components/org.apache.stratos.manager/src/main/java/org/apache/stratos/manager/subscription/utils/CartridgeSubscriptionUtils.java
@@@ -201,233 -167,13 +201,240 @@@ public class CartridgeSubscriptionUtil
      public static boolean isAliasTaken (int tenantId, String alias) {
  
          DataInsertionAndRetrievalManager dataInsertionAndRetrievalManager = new DataInsertionAndRetrievalManager();
-         return (dataInsertionAndRetrievalManager.getCartridgeSubscription(tenantId, alias) == null) ? false : true;
+         // return (dataInsertionAndRetrievalManager.getCartridgeSubscription(tenantId, alias) == null) ? false : true;
+         // fixing STRATOS-427, making the alias globally unique
+         return (dataInsertionAndRetrievalManager.getCartridgeSubscriptionForAlias(alias) == null) ? false : true;
+     }
+ 
+     public static String limitLengthOfString (String source, int length) {
+ 
+         return source.substring(0, length);
      }
 +
 +    public static LBDataContext getLoadBalancerDataContext (SubscriptionData subscriptionData, LoadbalancerConfig lbConfig) throws UnregisteredCartridgeException, ADCException {
 +
 +        String lbCartridgeType = lbConfig.getType();
 +
 +        LBDataContext lbDataCtxt = new LBDataContext();
 +        // set tenant Id
 +        lbDataCtxt.setTenantId(subscriptionData.getTenantId());
 +
 +        Properties lbReferenceProperties = lbConfig.getProperties();
 +
 +        Property lbRefProperty = new Property();
 +        lbRefProperty.setName(org.apache.stratos.messaging.util.Constants.LOAD_BALANCER_REF);
 +
 +        for (org.apache.stratos.cloud.controller.pojo.Property prop : lbReferenceProperties.getProperties()) {
 +
 +            String name = prop.getName();
 +            String value = prop.getValue();
 +
 +            // TODO make following a chain of responsibility pattern
 +            if (Constants.NO_LOAD_BALANCER.equals(name)) {
 +
 +                if ("true".equals(value)) {
 +                    if (log.isDebugEnabled()) {
 +                        log.debug("This cartridge does not require a load balancer. " +
 +                                "[Type] " + subscriptionData.getCartridgeType());
 +                    }
 +                    lbRefProperty.setValue(name);
 +                    lbDataCtxt.addLoadBalancedServiceProperty(lbRefProperty);
 +                    break;
 +                }
 +            } else if (Constants.EXISTING_LOAD_BALANCERS.equals(name)) {
 +
 +                String clusterIdsVal = value;
 +                if (log.isDebugEnabled()) {
 +                    log.debug("This cartridge refers to existing load balancers. " + "[Type] " +
 +                            subscriptionData.getCartridgeType() + "[Referenced Cluster Ids] " + clusterIdsVal);
 +                }
 +
 +                String[] clusterIds = clusterIdsVal.split(",");
 +
 +                for (String clusterId : clusterIds) {
 +                    try {
 +                        AutoscalerServiceClient.getServiceClient().checkLBExistenceAgainstPolicy(clusterId, subscriptionData.getDeploymentPolicyName());
 +                    } catch (Exception ex) {
 +                        // we don't need to throw the error here.
 +                        log.error(ex.getMessage(), ex);
 +                    }
 +                }
 +
 +                lbRefProperty.setValue(name);
 +                lbDataCtxt.addLoadBalancedServiceProperty(lbRefProperty);
 +                break;
 +
 +            } else if (Constants.DEFAULT_LOAD_BALANCER.equals(name)) {
 +
 +                if ("true".equals(value)) {
 +
 +                    lbRefProperty.setValue(name);
 +
 +                    CartridgeInfo lbCartridgeInfo;
 +
 +                    try {
 +                        lbCartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(lbCartridgeType);
 +
 +                    } catch (UnregisteredCartridgeException e) {
 +                        String message = lbCartridgeType + " is not a valid cartridgeSubscription type";
 +                        log.error(message);
 +                        throw e;
 +
 +                    } catch (Exception e) {
 +                        String message = "Error getting info for " + lbCartridgeType;
 +                        log.error(message, e);
 +                        throw new ADCException(message, e);
 +                    }
 +
 +                    lbDataCtxt.setLbCartridgeInfo(lbCartridgeInfo);
 +
 +                    if (log.isDebugEnabled()) {
 +                        log.debug("This cartridge uses default load balancer. " + "[Type] " + subscriptionData.getCartridgeType());
 +                    }
 +
 +                    try {
 +                        // get the valid policies for lb cartridge
 +                        DeploymentPolicy[] lbCartridgeDepPolicies =
 +                                getAutoscalerServiceClient().getDeploymentPolicies(lbCartridgeType);
 +                        // traverse deployment policies of lb cartridge
 +                        for (DeploymentPolicy policy : lbCartridgeDepPolicies) {
 +
 +                            // check existence of the subscribed policy
 +                            if (subscriptionData.getDeploymentPolicyName().equals(policy.getId())) {
 +
 +                                if (!getAutoscalerServiceClient().checkDefaultLBExistenceAgainstPolicy(subscriptionData.getDeploymentPolicyName())) {
 +
 +                                    Properties lbProperties = new Properties();
 +
 +                                    // if LB cartridge definition has properties as well, combine
 +                                    if (lbCartridgeInfo.getProperties() != null && lbCartridgeInfo.getProperties().length > 0) {
 +                                        lbProperties.setProperties(combine(lbCartridgeInfo.getProperties(), new Property[]{lbRefProperty}));
 +
 +                                    } else {
 +                                        lbProperties.setProperties(new Property[]{lbRefProperty});
 +                                    }
 +
 +                                    lbDataCtxt.addLBProperties(lbProperties);
 +                                }
 +                            }
 +                        }
 +
 +                    } catch (Exception ex) {
 +                        // we don't need to throw the error here.
 +                        log.error(ex.getMessage(), ex);
 +                    }
 +
 +                    // set deployment and autoscaling policies
 +                    lbDataCtxt.setDeploymentPolicy(subscriptionData.getDeploymentPolicyName());
 +                    lbDataCtxt.setAutoscalePolicy(lbCartridgeInfo.getDefaultAutoscalingPolicy());
 +
 +                    lbDataCtxt.addLoadBalancedServiceProperty(lbRefProperty);
 +                    break;
 +                }
 +
 +            } else if (Constants.SERVICE_AWARE_LOAD_BALANCER.equals(name)) {
 +
 +                if ("true".equals(value)) {
 +
 +                    lbRefProperty.setValue(name);
 +
 +                    CartridgeInfo lbCartridgeInfo;
 +
 +                    try {
 +                        lbCartridgeInfo = CloudControllerServiceClient.getServiceClient().getCartridgeInfo(lbCartridgeType);
 +
 +                    } catch (UnregisteredCartridgeException e) {
 +                        String message = lbCartridgeType + " is not a valid cartridgeSubscription type";
 +                        log.error(message);
 +                        throw e;
 +
 +                    } catch (Exception e) {
 +                        String message = "Error getting info for " + lbCartridgeType;
 +                        log.error(message, e);
 +                        throw new ADCException(message, e);
 +                    }
 +
 +                    lbDataCtxt.setLbCartridgeInfo(lbCartridgeInfo);
 +
 +                    // add a property for the service type
 +                    Property loadBalancedServiceTypeProperty = new Property();
 +                    loadBalancedServiceTypeProperty.setName(Constants.LOAD_BALANCED_SERVICE_TYPE);
 +                    // set the load balanced service type
 +                    loadBalancedServiceTypeProperty.setValue(subscriptionData.getCartridgeType());
 +
 +                    if (log.isDebugEnabled()) {
 +                        log.debug("This cartridge uses a service aware load balancer. [Type] " + subscriptionData.getCartridgeType());
 +                    }
 +
 +                    try {
 +
 +                        // get the valid policies for lb cartridge
 +                        DeploymentPolicy[] lbCartridgeDepPolicies = getAutoscalerServiceClient().getDeploymentPolicies(lbCartridgeType);
 +                        // traverse deployment policies of lb cartridge
 +                        for (DeploymentPolicy policy : lbCartridgeDepPolicies) {
 +                            // check existence of the subscribed policy
 +                            if (subscriptionData.getDeploymentPolicyName().equals(policy.getId())) {
 +
 +                                if (!getAutoscalerServiceClient().checkServiceLBExistenceAgainstPolicy(subscriptionData.getCartridgeType(),
 +                                        subscriptionData.getDeploymentPolicyName())) {
 +
 +                                    Properties lbProperties = new Properties();
 +
 +                                    // if LB cartridge definition has properties as well, combine
 +                                    if (lbCartridgeInfo.getProperties() != null && lbCartridgeInfo.getProperties().length > 0) {
 +                                        lbProperties.setProperties(combine(lbCartridgeInfo.getProperties(), new Property[]{lbRefProperty, loadBalancedServiceTypeProperty}));
 +
 +                                    } else {
 +                                        lbProperties.setProperties(new Property[]{lbRefProperty, loadBalancedServiceTypeProperty});
 +                                    }
 +
 +                                    // set a payload property for load balanced service type
 +                                    Property payloadProperty = new Property();
 +                                    payloadProperty.setName("LOAD_BALANCED_SERVICE_TYPE");  //TODO: refactor hardcoded name
 +                                    payloadProperty.setValue(subscriptionData.getCartridgeType());
 +
 +                                    lbDataCtxt.addLBProperties(lbProperties);
 +                                }
 +                            }
 +                        }
 +
 +                    } catch (Exception ex) {
 +                        // we don't need to throw the error here.
 +                        log.error(ex.getMessage(), ex);
 +                    }
 +
 +                    // set deployment and autoscaling policies
 +                    lbDataCtxt.setDeploymentPolicy(subscriptionData.getDeploymentPolicyName());
 +                    lbDataCtxt.setAutoscalePolicy(lbCartridgeInfo.getDefaultAutoscalingPolicy());
 +
 +                    lbDataCtxt.addLoadBalancedServiceProperty(lbRefProperty);
 +                    break;
 +                }
 +            }
 +        }
 +
 +        return lbDataCtxt;
 +    }
 +
 +    private static AutoscalerServiceClient getAutoscalerServiceClient () throws ADCException {
 +
 +        try {
 +            return AutoscalerServiceClient.getServiceClient();
 +
 +        } catch (AxisFault axisFault) {
 +            String errorMsg = "Error in getting AutoscalerServiceClient instance";
 +            log.error(errorMsg, axisFault);
 +            throw new ADCException (errorMsg, axisFault);
 +        }
 +    }
 +
 +    private static Property[] combine (Property[] propertyArray1, Property[] propertyArray2) {
 +
 +        int length = propertyArray1.length + propertyArray2.length;
 +        Property[] combinedProperties = new Property[length];
 +        System.arraycopy(propertyArray1, 0, combinedProperties, 0, propertyArray1.length);
 +        System.arraycopy(propertyArray2, 0, combinedProperties, propertyArray1.length, propertyArray2.length);
 +
 +        return combinedProperties;
 +    }
  }