001/*
002 * Copyright (c) 2007-2017 Xplenty, Inc. All Rights Reserved.
003 *
004 * Project and contact information: http://www.cascading.org/
005 *
006 * This file is part of the Cascading project.
007 *
008 * Licensed under the Apache License, Version 2.0 (the "License");
009 * you may not use this file except in compliance with the License.
010 * You may obtain a copy of the License at
011 *
012 *     http://www.apache.org/licenses/LICENSE-2.0
013 *
014 * Unless required by applicable law or agreed to in writing, software
015 * distributed under the License is distributed on an "AS IS" BASIS,
016 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
017 * See the License for the specific language governing permissions and
018 * limitations under the License.
019 */
020
021package cascading.management.state;
022
023import java.util.Map;
024
025import cascading.management.CascadingServices;
026import cascading.management.DocumentService;
027import cascading.management.MetricsService;
028import cascading.provider.CascadingService;
029import org.slf4j.Logger;
030import org.slf4j.LoggerFactory;
031
032/**
033 *
034 */
035public abstract class BaseState implements CascadingService
036  {
037  private static final Logger LOG = LoggerFactory.getLogger( BaseState.class );
038
039  private String id;
040
041  MetricsService metricsService = new CascadingServices.NullMetricsService();
042  DocumentService documentService = new CascadingServices.NullDocumentService();
043
044  public BaseState()
045    {
046    }
047
048  @Override
049  public boolean isEnabled()
050    {
051    return metricsService.isEnabled() || documentService.isEnabled();
052    }
053
054  @Override
055  public void setProperties( Map<Object, Object> properties )
056    {
057    }
058
059  public void initialize( CascadingServices cascadingServices, String id )
060    {
061    this.id = id;
062
063    if( cascadingServices == null )
064      return;
065
066    metricsService = cascadingServices.getMetricsService();
067    documentService = cascadingServices.getDocumentService();
068    }
069
070  /** May be called more than once. Each internal service should be idempotent. */
071  public synchronized void startService()
072    {
073    if( !safelyStartService( metricsService ) )
074      metricsService = new CascadingServices.NullMetricsService();
075
076    if( !safelyStartService( documentService ) )
077      documentService = new CascadingServices.NullDocumentService();
078    }
079
080  private boolean safelyStartService( CascadingService service )
081    {
082    try
083      {
084      service.startService();
085      return true;
086      }
087    catch( Throwable throwable )
088      {
089      LOG.warn( "unable to start cascading service: {}, with message: {}", service.getClass().getName(), throwable.getMessage() );
090      LOG.debug( "with exception", throwable );
091      return false;
092      }
093    }
094
095  public void stopService()
096    {
097    // not stopping services, they are singletons,
098    // and need to live beyond the shutdown hooks
099    }
100
101  String[] getContext( Enum context )
102    {
103    return getContext( getGroup( context ), context.toString() );
104    }
105
106  String getGroup( Enum metric )
107    {
108    return metric.getClass().getSimpleName();
109    }
110
111  abstract String[] getContext( String group, String metric );
112
113  public String getID()
114    {
115    return id;
116    }
117
118  protected void store( String id, Object value )
119    {
120    documentService.put( id, value );
121    }
122
123  protected void setMetric( Enum metric, long value )
124    {
125    metricsService.set( getContext( metric ), value );
126    }
127
128  protected void setMetric( String group, String metric, long value )
129    {
130    metricsService.set( getContext( group, metric ), value );
131    }
132
133  protected void setMetric( String group, String metric, String value )
134    {
135    metricsService.set( getContext( group, metric ), value );
136    }
137
138  private void incrementMetric( Enum metric, int value )
139    {
140    metricsService.increment( getContext( metric ), value );
141    }
142
143  private void incrementMetric( String group, String metric, int value )
144    {
145    metricsService.increment( getContext( group, metric ), value );
146    }
147
148  String[] asArray( String... strings )
149    {
150    return strings;
151    }
152  }